1 使用
- 用static修饰的变量是类变量,修饰的方法就是类方法,修饰之后虽然可以用该类的对象来调用,修改其值,但是一般用 类名. 变量名/方法 来调用。(类名.变量名/方法 不能调用非static,会报错)
- tip:它在类加载的时候最先加载,所以它的加载会先于new类对象的加载
2 static的特点
-
数据共享,每个类对象都共用同一个static修饰的类变量/方法,
-
属于类,不属于对象
-
优先于非static变量/方法的加载,所以也优先于对象的产生。
-
static(static方法/static代码块/main方法)中都不能用"this." 来调用变量/方法
3 类加载时各个部分的执行顺序
-
在实例化一个类对象时以下三者的加载顺序:
①先加载static静态代码块(静态构造器) 、静态方法、静态变量
②再加载匿名代码块(通用构造器),如下格式:
{
...(代码)...
}
③后加载构造方法。
tip:①在类加载全过程只执行一次,②和③会在每次new一个对象时执行。(效果如下图控制台输出)
- 因此,在static(静态)的代码块/方法(包括main方法)中不能通过"this."调用非static的部分。(因为"this"关键字是在加载非静态资源的时候才有的,所以在还没加载出来的时候就去调用它肯定会报错)
(在method2中则可以通过 类名.method1()或者 this.method1()或者method1()调用method1)
4 我的总结思考
若想在本类中调用static方法,可以直接写方法名,省略"this." 或者 "类名." ,但是想在其他类中的方法调用该类的static方法,则需要在其他类的方法中调用时加上该类的 "类名."(前提是方法有public修饰) 。所以,为了统一,一般在自己类调用自己的static方法时也用"类名." 或者"this."。
因为疏忽,上图的
public static void method1(){
method1();
}
会导致无限递归,不能这样写。
(本博客部分截图来自B站“老男孩IT教育”)