首页 > 代码库 > 阿里笔试题-派生类构造函数 创建顺序
阿里笔试题-派生类构造函数 创建顺序
派生类 与基类的关系:
(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
阿里笔试题-派生类构造函数 创建顺序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。