java(十八)【面向对象】子父类中构造函数的特点(子类实例化过程)
子父类中的构造函数
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句 super();
seper(); 会访问呢父类空参数的构造函数,而且子类中的所有构造函数默认第一行都是seper();
为什么子类一定要访问父类中的构造函数?
- 因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的
- 所以在子类在对象初始化时,要先访问一下父类中的构造函数
- 如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定
注意:super语句一定定义在子类构造函数的第一行
结论:
- 子类中所有的构造函数,默认都会访问父类中空参数的构造函数
- 因为子类每一个构造函数内的第一行都有一句隐式super
- 当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问的构造函数
- 当然,子类的构造函数第一行也可以指定this语句来访问本类中的构造函数,子类中至少会有一个构造函数会访问父类中中的函数
1 class Fu{ 2 int x =30; 3 Fu() 4 { 5 6 System.out.println(x); 7 } 8 Fu(int x) 9 { 10 System.out.println(x); 11 } 12 } 13 class Zi extends Fu { 14 Zi(){ 15 //seper(); 16 //super(4); //指定访问父类中带有一个参数的构造函数 17 this(20); 18 System.out.println("zi ..."+x); 19 } 20 Zi(int x) 21 { 22 System.out.println("zi..."+x); 23 } 24 25 } 26 public class Single { 27 public static void main(String[] args) { 28 Zi z=new Zi(); 29 //Zi z1=new Zi(3); 30 } 31 }
执行结果:

执行顺序:
- 先访问子类中的空参数构造函数,由于this()指定访问本类中带有一个参数的构造函数
- 在访问子类中带有一个参数的构造函数的时候,由于它有一个隐式的super(),所以先执行父类中的空构造函数。输出30
- 在执行子类中带有一个参数的System.out.println("zi..."+x);
- 最后执行子类中空参数函数的 System.out.println("zi ..."+x);


浙公网安备 33010602011771号