说实话,这块真的不好理解啊~都怪jvm 执行顺序搞这么复杂,哼╭(╯^╰)╮ 但是 我们能怎么办,只能研究呗!!!
!:首先,毫无置疑的,静态代码块在加载时就执行了,所以肯定是最先执行的。。。。
2:老师是不是说过,非静态代码块是在每次实例化对象时被调用的,那问题就来了,是非静态代码块中的内容先执行的,还是构造方法中的内容执行的呢?
其实:在Child Child = new Child()时,new Child()时就会创建一个对象了,但是这个对象还不会执行构造方法中的内容,然后带着这个创建的这个对象去执行非静态代码块中的 内容,执行完后,就去执行构造方法中的内容了,重点来了,其实在执行非静态代码块之前,会带着这个对象执行类中的成员变量部分,因为已经有了对象,所以就有了依附于对象的这些属性,那么这时这些属性的初始值就是这些属性的数据类型初始值,如果这些属性被赋值了,然后再被赋值。其实顺序就是:
用new创建并初始化对象步骤:
给对象的实例变量(非“常量”)分配内存空间,默认初始化成员变量;
成员变量声明时的初始化;
初始化块初始化(又称为构造代码块或非静态代码块);
构造方法初始化
下面的代码会帮助你理解
1 package thisTest; 2 3 public class Child { 4 5 private static String name; 6 7 static { 8 System.out.println("我是静态代码块!!!!!!所以我不能用this~"+name); 9 } 10 11 { 12 System.out.println(this+"我是动态代码块"+this.name); 13 } 14 public Child(String name) { 15 this.name = name; 16 System.out.println(this+"我是构造方法"+this.name); 17 } 18 19 public static void main(String[] args) { 20 Child child=new Child("张三"); 21 System.out.println(child+"普通方法"+child.name); 22 } 23 }
输出结果:
我是静态代码块!!!!!!所以我不能用this~null
thisTest.Child@52e922我是动态代码块null
thisTest.Child@52e922我是构造方法张三
thisTest.Child@52e922普通方法张三
执行的顺序为
11111111111111111111111
2222222222222222222222222222
3333333333333333333333333
444444444444444444444444444444
这就很好理解了吧~
好了 ,
不用谢我, 我是雷锋!告辞——