java中代码块和构造方法以及普通方法的代码执行顺序总结

说实话,这块真的不好理解啊~都怪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

这就很好理解了吧~

好了 ,

不用谢我, 我是雷锋!告辞—— 

原文地址:https://www.cnblogs.com/lyxcode/p/9016322.html