标签:sdn end detail string void auto ted blog tail
派生类 与基类的关系:
(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
标签:sdn end detail string void auto ted blog tail
原文地址:http://www.cnblogs.com/aspirant/p/6881810.html