子类初始化时,调用父类构造函数的规则是:如果父类没有任何构造函数,系统会
-
父类如果没有任何构造函数,系统会自动为父类生成一个无参构造函数,如果父类有带参构造函数,系统不会为父类生成无参构造函数;
-
如果父类和子类的构造函数都有参数且参数列表一样(包括参数的个数、类型、顺序),子类如果想调用父类的构造方法,必须在构造函数第一行用super(params)显式调用,否则子类的构造函数会去找父类的默认(无参)构造函数;
-
如果父类有无参构造函数,子类的构造函数除非显式用super(params)调用父类的带参构造函数,否则一定会执行父类的无参构造函数(不需要写super());
参考:google "java constructor", http://www.leepoint.net/notes-java/oop/constructors/constructor.html
父类有默认构造函数时
class SuperClass { public SuperClass() { System.out.println("I am the super class."); } public SuperClass (String name) { System.out.println("I am the super class with a name: " + name); }
public SuperClass (int age) { System.out.println("I am sub class with age: " + age); }
} public class TestedSubClass extends SuperClass { public TestedSubClass(){ System.out.println("I am sub class"); } public TestedSubClass(String name){ super(name); System.out.println("I am sub class with a name: " + name); } public TestedSubClass(int age) { System.out.println("I am sub class with age: " + age); }
public static void main(String[] args) { TestedSubClass tsc = new TestedSubClass(); TestedSubClass tsc2 = new TestedSubClass("chad"); TestedSubClass tsc3 = new TestedSubClass(33); } }
运行结果:
[java] I am the super class. [java] I am sub class [java] I am the super class with a name: chad [java] I am sub class with a name: chad [java] I am the super class. [java] I am sub class with age: 33
当父类有默认(无参数)构造函数情况下,子类初始化时,除非子类用super(param)显式调用其他构造函数,否则一定会执行父类的默认构造函数,不论子类初始化时有没有参数。
父类无默认构造函数
如果仅将父类的默认(无参)构造函数去掉重新运行,报找不到初始化方法错误,原因是当父类有带参构造函数时,系统不为父类生成构造函数,而第1次和第3次初始化子类对象时,会调用父类的无参构造方法,所以报错;
如果去掉父类中所有的构造函数,子类中保留无参和int参数两个构造函数,运行正常;
如果仅保留父类和子类的String参数构造方法,初始化运行正常;