下面代买的执行结果是什么?
1 public class FatherClass { 2 public FatherClass(){ 3 System.out.println(100); 4 } 5 public FatherClass(int age){ 6 System.out.println(age); 7 } 8 } 9 10 11 12 public class SonClass extends FatherClass { 13 public SonClass(){ 14 15 } 16 public SonClass(int c){ 17 System.out.println(1234); 18 } 19 public static void main(String[] args) { 20 SonClass s=new SonClass(66); 21 } 22 }
执行的结果是 100
1234
分析 : SonClass s=new SonClass(66); 在执行这句的时候,调用
public SonClass(int c){ System.out.println(1234); 系统会先调用父类五参数的构造函数(super()) 在这个构造函数中等价于 } public SonClass(int c){ super(); 必须第一行,否则编译不通过 System.out.println(1234); } 所以结果是 100 1234 在创建子类对象的时候,JAVA 虚拟机首先会执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,,将从继承树的最上层的父类开始,依次执行各个类的构造范法官,这可以保证子
类对象从所有直接或者间接父类中继承的实例变量都被正确的初始化。
如果子类的构造函数这样写
public SonClass(int c){ super(22); 必须第一行,否则编译不通过 显示的调用了有残数的 super 之后,系统不在调用无参数的 super System.out.println(1234); }
总结一、
1. JAVA 继承中对构造函数不是继承的,只是调用(隐式的或者显示的调用)
2. 构造函数不能被继承,只是调用而已。
3. 如果父类中没有无参数的构造器,创建子类的时候,不能编译,除非在构造函数的代码第一行,必须是第一行,显示的调用无参数的构造器。
4. 如果不显示的调用父类有参数的构造器,系统会默认调用父类的参数的构造器,但是父类中没有无参数的构造器,那也就不能调用了,所以编译器无法通过。
总结二、
创造有参数的构造器后,系统就不会默认无参数的构造器,如果没有任何构造函数,系统会默认一个无参数的构造器。