一.static
1.静态代码块:
代码在项目启动的时候就执行,这种代码是主动执行的,而且只执行一次。他常用做类属性的初始化。static{}
2.静态方法:
在类加载的时候就已经加载,在类名调用时才执行,这种代码是被动执行的。
注意:静态方法里只能调用同类中其他静态成员;
不能以任何方式引用this和super关键字,因为静态方法使用前不需创建任何对象实例,所以就不存在this。
3.静态变量:
属于整个类的变量而不是某个对象,任何方法都不能声明static变量。
二.类的加载
1.什么时候加载
类的加载是通过类加载器(Classloader)完成的。
两种情况加载类:
只要有其它类引用了它就加载;等到
类初始化发生的时候才加载。应该跟不同jvm有关
静态加载:new ClassName();编译时就提供
动态加载:Class.forName("ClassName") ; 编译时可缺席
2.那什么时候初始化
加载完类后类的初始化就会发生,会初始化所有静态成员。
4.加载顺序
加载类时初始化顺序:
按顺序加载对象的静态属性--->再加载静态代码块--->加载类的主函数
对象实例化时加载顺序:
加载对象的非静态属性--->非静态代码块--->构造方法
有父类的情况:加载父类(初始化步骤)-->加载子类(初始化)-->加载父类(实例化)-->加载子类(实例化)
public class Test { public static int k = 0; public static Test t1 = new Test("t1"); public static Test t2 = new Test("t2"); public static int i = print("i"); public static int n = 99; public int j = print("j"); { print("构造块"); } static { print("静态块"); } public Test(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; ++n; } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++n; return ++i; } public static void main(String args[]) { Test t = new Test("init"); } // 加载顺序 静态变量、成员变量加载,初始化为零。执行顺序 静态变量>静态代码块>主函数(静态方法)>成员变量>构造代码块>构造函数 }
* 1.顺序加载类的静态属性(非静态不管)
* 这里加载的是:public static int k = 0;
* 然后加载:public static StaticTest t1 = new StaticTest("t1");
* 因为此处进行了类的实例化所以
* 1.1加载类的非静态属性
* 这里是:public int j = print("j");
* 这里加载的是:public static int k = 0;
* 然后加载:public static StaticTest t1 = new StaticTest("t1");
* 因为此处进行了类的实例化所以
* 1.1加载类的非静态属性
* 这里是:public int j = print("j");
》》》
1:j i=0 n=0
* 1.2顺序加载类中的非static代码块(static暂时不加载)
* 这里是:print("构造快");和print("静态块");
* 1.2顺序加载类中的非static代码块(static暂时不加载)
* 这里是:print("构造快");和print("静态块");
》》》
2:构造快 i=1 n=1
* 1.3加载类的构造方法
* 这里是:public StaticTest(String str)
3:静态块 i=2 n=2
* 这里是:public StaticTest(String str)
》》》
4:t1 i=3 n=3
(一个静态属性的实例就完成了)
* 然后 加载:public static StaticTest t2 = new StaticTest("t2"); 因为进行了类的实例化所以 重复(1.1-1.3)
* 然后 加载:public static StaticTest t2 = new StaticTest("t2"); 因为进行了类的实例化所以 重复(1.1-1.3)
》》》
5:j i=4 n=4
6:构造快 i=5 n=5
7:静态块 i=6 n=6
8:t2 i=7 n=7
*
然后
加载:public static int i = print("i");
》》》
9:i i=8 n=8
* 然后 加载:public static int n = 99; 注意现在n为99了
* 2.如果有static代码块,在这里先加载,这个里面没有
* 然后 加载:public static int n = 99; 注意现在n为99了
* 2.如果有static代码块,在这里先加载,这个里面没有
* 3.
加载主函数
* 这里加载的是:StaticTest t = new StaticTest("init"); 因为进行了类的实例化所以 重复1.1-1.3
* 这里加载的是:StaticTest t = new StaticTest("init"); 因为进行了类的实例化所以 重复1.1-1.3
》》》
10:j i=9 n=99
11:构造快 i=10 n=100
12:静态块 i=11 n=101
13:init i=12 n=102
转载自http://blog.sina.com.cn/s/blog_1552a7b490102w3xk.html