构造方法的执行顺序

通过打印内容来观察构造方法的执行顺序,子类Demo2继承父类Demo1。

 1 public class Demo1 {
 2 
 3     private String name;
 4 
 5     public Demo1() {
 6         System.out.println("无参构造Demo1");    
 7     }
 8     public Demo1(String name) {
 9         this.name = name;
10         System.out.println("有参构造Demo1");
11     }
12     {
13         System.out.println("构造代码块Demo1");
14     }
15     static {
16         System.out.println("静态代码块Demo1");
17     }
18     void say(){
19         System.out.println("Demo1方法");
20     }
22 }
 1 public class Demo2 extends Demo1 {
 2     {
 3         System.out.println("构造代码块Demo2");
 4     }
 5     static {
 6         System.out.println("静态代码块Demo2");
 7     }
 8 
 9     public Demo2() {
10         System.out.println("无参构造demo2");
11     }
12 
13     void say() {
14         System.out.println("Demo2方法");
15     }
16 
17     public static void main(String[] args) {
18         Demo2 d2 = new Demo2();
19         Demo1 d1 = new Demo1();
20         d2.say();
21         d1.say();
22         d1 = d2;
23         d1.say();
24     }
25 }

输出结果:

静态代码块Demo1     //new Demo2(): 父类的静态代码块优先执行,并且只执行一次
静态代码块Demo2   //new Demo2(): 然后执行子类的静态代码块,也只执行一次
构造代码块Demo1   //new Demo2(): 充分说明创建子类对象时,会优先实例化父类对象
无参构造Demo1    //new Demo2(): 优先级: 静态代码块 > 构造代码块  > 构造方法
构造代码块Demo2     //new Demo2(): 开始创建子类对象
无参构造demo2    //new Demo2() : 调用无参构造创建对象
构造代码块Demo1   //new Demo1(): 重新创建父对象
无参构造Demo1      //new Demo1() : 重新调用构造方法,充分说明:构造方法和构造代码块每次创建对象时都会执行,但是静态代码块只执行一次。
Demo2方法         //d2.say();
Demo1方法         //d1.say();
Demo2方法         //d1.say();

 

posted @ 2021-03-17 16:31  进击的小白·  阅读(193)  评论(0)    收藏  举报