派生类构造函数 创建顺序(阿里笔试题)

派生类 与基类的关系:

(1)创建构造函数的顺序 :基类构造函数(注意此处基类的成员不能初始化) ==>派生类成员初始化 ==>派生类构造函数

(2)派生类的构造函数 中 基类的构造函数默认在第一条,如果不写super(),则默认在第一条,注意位置不能颠倒

(3)派生类可以继承全部的基类的构造函数

阿里笔试题 举个栗子:

 1 package com.test;
 2 
 3 public  class DispatchTest {
 4     
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7          Base b=null; //此处如果 换成 Sub b=null,则b.x=40;不再是20
 8          b=new Sub();
 9          System.out.println(b.x);
10     }
11     
12     static class Base {
13       
14       int x =10;
15       
16       public Base(){
17          this.printMessage();
18          x=20;
19       }
20       
21       public void printMessage(){
22           System.out.println("Base.x="+x);
23       }
24       
25   }
26   
27   static class Sub extends Base{
28       
29       int x =30;      
30       public Sub(){
31           super();//此处的super();去掉也可以,默认执行super(); 而且只能在构造函数的第一行,如果放在其他行,编译错误,
32           this.printMessage();
33           x=40;
34           
35       }
36       
37       public void printMessage(){
38           System.out.println("Sub.x="+x);
39       }
40   } 
41 
42 }

结果打印为:

Sub.x=0
Sub.x=30
20

如上分析可以看出  第八行开始初始化 派生类Sub的构造函数,按照刚才的顺序

首先初始化基类的构造函数(不包含基类成员)因此

(1)基类的构造函数==>执行 17行,this.printMessage();注意此处的this是派生类,并且派生类的成员还没有初始化,因此x=0;

打印 Sub.x=0

(2)执行18行,基类的x =20

(3)派生类的成员==>执行29行 x=30;

(4)派生类构造函数==>执行32行;打印 Sub.x=30;

(5)然后执行9行,注意,此处的Sub属于派生类,包含了两类实例 基类 base b 和 sub b,

因为第7行强制转化为基类,因此 b.x =20(基类的) 打印 20;

如果第7行为Sub b,则b.x=40(派生类) 打印 40;

综上 结果:

Sub.x=0
Sub.x=30
20

参考:

http://tieba.baidu.com/p/1453582263

http://blog.csdn.net/m631521383/article/details/9819241

http://blog.csdn.net/libaineu2004/article/details/19565229