构造方法的执行顺序
通过打印内容来观察构造方法的执行顺序,子类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();

浙公网安备 33010602011771号