class Test{ int num = 8; static //静态代码块 { System.out.println("静态代码"); } { //构造代码块 System.out.println(num); } public Test(int num) // 构造方法 { this.num = num; }}class TestDemo{ public static void main(String[] args) { Test t = new Test(3); System.out.println(t.num); }}
输出结果:
静态代码 8 3Test t = new Test(3);这句话都干了什么
1、new用到Test.class,先找到Test.class文件并加载到内存中 (若如上num在类中静态初始化,则num的值初始化为8,则下文的默认初始化就没了)
2、执行该类的静态代码块(静态的成员随类加载而执行)
3、在堆内存中开辟内存空间,分配内存地址,并在栈中创建变量p。
4、在堆内存中建立对象的特有属性,并进行默认初始化。
5、对属性进行显示初始化(即用语句对变量进行的初始化,这里指上句中的3)
6、对对象的构造代码段初始化。
7、对对象的对应构造函数初始化。
8、将内存地址赋给内存中的变量。
这也可以解释为什么静态方法不能调用非静态成员了
注意:静态的成员是按语句顺序进行执行的,若代码如下:
1 static2 {3 System.out.println("静态代码"+num);4 }5 static int num = 8;
则会出现非法向上引用的错误