从零学Java - 面向对象 Static

面向对象 Static

文章目录

  • 面向对象 Static
    • 1.什么是静态?
    • 2.Static的作用
      • 2.1 属性
        • 2.1.1 实例属性
        • 2.1.2 静态属性
      • 2.2 方法
        • 2.2.1 静态方法
      • 2.3 代码块
        • 2.3.1 局部代码块
        • 2.3.2 动态代码块
        • 2.3.3 静态代码块
      • 2.4 静态导入
    • 3.类加载
      • 3.1 什么是类加载?
      • 3.2 触发类加载的5种情况
      • 3.3 类加载过程的5个阶段
    • 4.面试题

1.什么是静态?

概念: 共享的, 共有的;

基本用法:

  • 静态(static)可以修饰属性,称为静态属性(类属性)。
  • 静态(static)可以修饰方法,称为静态方法(类方法)。

特点

  • 静态成员是类所有对象共享的成员,在全类中只有一份,不因创建多个对象而产生多份。
  • 静态成员访问不必创建对象,可直接通过类名访问。

使用场景:

  • 一般工具类中属性和方法都是静态的。比如:Arrays、Math
  • 如果这个属性或方法只需要一份,使用静态修饰。比如:main方法

2.Static的作用

2.1 属性

2.1.1 实例属性

实例属性是每个对象各自持有的独立空间(多份),对象单方面修改,不会影响其他对象。

eg:

public class Test {public static void main(String[] args) {Student stu_1 = new Student();stu_1.name = "小明";Student stu_2 = new Student();stu_2.name = "小红";}
}public class Student {String name;
}
2.1.2 静态属性

静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象。

eg:

public class Test {public static void main(String[] args) {System.out.println("使用类名访问静态属性");Student.count = 2000;System.out.println("学生数量为:"+Student.count);}
}public class Student {static int count;
}

eg:

练习:统计一个类的对象被创建过多少次?
//Student
public class Student {String name;int age;String gender;double score;//默认为0, 创建对象的次数public static int count;public Student() {Student.count++;}public Student(String name, int age, String gender, double score) {Student.count++;this.name = name;this.age = age;this.gender = gender;this.score = score;}
}
//Test
public class Test {public static void main(String[] args) {Student stu_1 = new Student();stu_1.name = "小明";stu_1.age = 18;stu_1.gender = "男";stu_1.score = 100;Student stu_2 = new Student();stu_2.name = "小红";stu_2.age = 18;stu_2.gender = "女";stu_2.score = 100;Student stu_3 = new Student("小绿", 20, "男", 98);System.out.println("使用类名访问静态属性");System.out.println("学生数量为:"+Student.count);}
}

2.2 方法

2.2.1 静态方法

被 static 修饰的方法, 称为静态方法;

public class Student {//默认为0, 创建对象的次数public static int count;public static void calcCount() {System.out.println("开始统计...");Student.count = 2000;System.out.println("统计结束...");//可在本类中,通过“静态方法名”访问method();  // Student.method();}public static void method() {// 方法体}
}public class Test {public static void main(String[] args) {System.out.println("使用类名访问静态方法");//可在其他类中,通过“类名.静态方法名”访问Student.calcCount();System.out.println("学生数量为:"+Student.count);}
}
  • 可在本类中, 通过 “静态方法名” 访问;
  • 可在其他类中, 通过 “类名.静态方法名” 访问;

特点:

  • 静态方法允许直接访问静态属性和静态方法。
  • 静态方法不能直接访问实例属性和实例方法,需要创建对象访问。
  • 非静态方法中可以直接访问静态属性和静态方法。
  • 静态方法中不允许使用this或是super关键字。
  • 静态方法可以被继承,可以重载,不能被重写(重写只存在于实例方法之间)。

2.3 代码块

2.3.1 局部代码块

局部代码块:定义在方法内部的代码块。

eg:

public class TestBlock {public static void main(String[] args) {int num1 = 100;{int num2 = 200;System.out.println(num1);System.out.println(num2);}}
}

作用: 会缩小变量的使用范围,提前释放局部变量,节省内存。

2.3.2 动态代码块

动态代码块:定义在方法外,类内部的代码块。

执行时机:创建对象时,触发动态代码块的执行。作用:可为实例属性初始化。

代码编译后会将动态代码块中的内容添加到每个构造方法的首行;

eg:

//Student
public class Student {String name;public Student() {//System.out.println("动态代码块执行了");}public Student(String name) {//System.out.println("动态代码块执行了");this.name = name;}//动态代码块{System.out.println("动态代码块执行了");}
}
2.3.3 静态代码块

静态代码块:使用static修饰的动态代码块。

执行时机类加载时,触发静态代码块的执行(仅一次)。

作用:可为静态属性初始化。

eg:

//Student
public class Student {String name;public Student() {}public Student(String name) {this.name = name;}//静态代码块static {System.out.println("静态代码块执行了");}
}

2.4 静态导入

eg:

package StageOne.day12.demo04;
import static java.lang.System.out;
/*** @author 胡昊龙* @version 1.0* @description: TODO* @date 2024/1/4 16:33*/
public class TestImportStatic {public static void main(String[] args) {out.println("静态导入");}
}

3.类加载

3.1 什么是类加载?

JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件。
将.class文件中对类的描述信息加载到内存中,进行保存。如:包名、类名、父类、属性、方法、构造方法…

3.2 触发类加载的5种情况

  • 创建对象。

    Student s=new Student();
    
  • 创建子类对象。

    class CollegeStudent extends Student {...}CollegeStudent stu = new CollegeStudent();
    
  • 访问静态属性。

    static int count; //静态属性System.out.println(Student.count);
    
  • 调用静态方法。

    public static void method() {...} // 静态方法Student.method();
    
  • 主动加载:Class.forName(“全限定名”);//后面讲

3.3 类加载过程的5个阶段

类加载的五个阶段:

  • 加载—>链接 (验证—>准备—>解析)—>初始—>使用—>卸载

准备:为类的静态属性分配空间,并赋值默认值(静态常量除外)

初始化:从上到下执行静态变量赋值,静态代码块

4.面试题

eg:

阅读下方代码, 请说明运行结果和具体的执行过程
public class TestStatic {public static void main(String[] args) {Demo.show();}
}
class Demo {static {Demo.count1++;Demo.count2++;}private static Demo demo = new Demo();public static int count1;public static int count2=0;public Demo() {Demo.count1++;Demo.count2++;}public static void show() {System.out.println("count1:"+count1);System.out.println("count2:"+count2);}
}

res:

count1:2
count2:0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8K超高清应用:输电线网智慧巡检提升巡视效率

电力安全关系国计民生,是国家安全的重要保障,因此确保电力线路系统的安全运行至关重要。电力线路系统整体分为三大板块:输电线路、变电站和配电线路。然而,由于自然灾害、人为破坏等因素影响,这三大板块的设备很容易发…

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError 文章目录 【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError1. 报错的具体情况2. 解决过程3. 其他问题3.1 ModuleNotFoundError: No module named OpenGL3.2 ModuleNotFoundEr…

【kettle】pdi/data-integration 打开ktr文件报错“Unable to load step info from XML“

一、报错内容: Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettleXMLException: Unable to load step info from XMLat org.pentaho.commons.launcher.Launcher.main (Launcher.java:92)at java.lang.reflect.Method.invoke (Met…

web动态月球特效

文章目录 效果预览文件分布代码 效果预览 文件分布 代码 鼠标点击特效 fireworks.js class Circle {constructor({ origin, speed, color, angle, context }) {this.origin originthis.position { ...this.origin }this.color colorthis.speed speedthis.angle anglethi…

性能优化-OpenMP基础教程(四)-全面讲解OpenMP基本编程方法

本文主要介绍OpenMP编程的编程要素和实战,包括并行域管理详细实战、任务分担详细实战。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀C…

MySQL面试题汇总

常规: 1、数据库三大范式 1NF : 表中字段的数据不可再拆分。(原子性)2NF : 在满足第一范式的情况下,遵循唯一性,消除部分依赖。即,表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。(一个表…

uniapp 无限级树形结构面包屑、单选-多选、搜索、移除功能插件,基于【虚拟列表】高性能渲染海量数据,加入动态高度、缓冲区

hyq-tree-vtw 无限级树形结构面包屑、单选-多选、搜索、移除功能 示例项目 单选-user 单选-任意一项 多选-关联下级 多选-任意一项 已选择数据弹框 说明 本插件需要使用uni-popup、uni-transition用于已选择数据弹框,因此需要有这些依赖,请自行导入本插件基于【虚…

如何通过Python将各种数据写入到Excel工作表

在数据处理和报告生成等工作中,Excel表格是一种常见且广泛使用的工具。然而,手动将大量数据输入到Excel表格中既费时又容易出错。为了提高效率并减少错误,使用Python编程语言来自动化数据写入Excel表格是一个明智的选择。Python作为一种简单易…

医院信息系统集成平台—医院决策分析平台(2)

“医院决策分析系统”需求主要包括五部分工作内容:数据库设计、指标库的构建、指标数据的采集、指标分析及展现。 指标加工逻辑架构 下图描述的是物理的数据存储与业务上的指标库之间的映射关系。事实上,整个“指标库”建立和管理的核心问题就是,业务人员所使用的指标与物…

SpringCloud Alibaba之Nacos配置中心配置详解

目录 Nacos配置中心数据模型Nacos配置文件加载Nacos配置 Nacos配置中心数据模型 Nacos 数据模型 Key 由三元组唯一确定,三元组分别是Namespace、Group、DataId,Namespace默认是公共命名空间(public),分组默认是 DEFAUL…

任务调度知识点

任务调度 定时任务调度 定时任务调度在项目开发中是一种不可缺少的需求,在Java中,实现任务调度有三种方式,分别是jdk自带的任务定时工具Timer、Spring task、第三方组件Quartz,接下来细聊这三种方式。 方式一、Timer(JDK自带任…

BUUCTF crypto做题记录(5)新手向

一、传统知识古典密码 加上一个数,就有点移位加密的味道,很有可能就是凯撒加密 辛卯28,癸巳30,丙戌23,辛未8,庚辰17,癸酉10,己卯16,癸巳30 加1之后,28变29&a…