首页 > 代码库 > 阿里笔试题-派生类构造函数 创建顺序

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

派生类 与基类的关系:

(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=0Sub.x=3020

如上分析可以看出  第八行开始初始化 派生类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=0Sub.x=3020

 

参考:

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

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

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

 

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