何时子类必须显式调用父类构造函数

11. class Person{
12. String name = "No name";
13. public Person(String nm){name = nm;}
14. }
15.
16. class Employee extends Person{
17. String empID = "0000";
18. public Employee(String id){empID = id;}
19. }
20.
21. class EmployeeTest{
22. public static void main(String[] args){
23. Employee e = new Employee("4321");
24. System.out.println(e.empID);
25. }
26. }
What is the result?
A. 4321
B. 0000
C. An exception is thrown at runtime.
D. Compilation fails because of an error in line 18.
答案:D
答案大家看到了!测试时,18行编译错误,如果在18行的构造方法加入 super(null);就会编译成功了!我的感觉错误就在于没有显示调用父类的构造方法!可有的时候,不需要显示调用父类方法啊!这是为什么呢?

 

 

//解释

先理解一个对象的实例化过程即可。
Child extend Parent

在实例化Child的时候,会先去实例化Parent(嵌套的一层层上溯)。

Child c = new Child();一瞬间做的事情:
实例化是在构造函数中完成的,那么,调用Child的构造函数时候,必须先拿到Parent的对象也就是调用Parent的构造函数。

回到你的题目,Parent没有默认构造函数,Child也只有一个带参构造函数。
Child c = new Child(p);
要实例化c必须先实例化Parent
但是,Parent没有默认构造函数,只能用带参构造函数实例化它。
但你的子类代码中没有显式去调用Parent的那个构造函数,Parent就无法完成初始化。

何时子类必须显式调用父类构造函数:
1 父类没有默认构造函数(这时候子类必须无条件显式写一个任意的构造函数包括默认构造函数,第一句就是super(...))

2 父类有默认构造函数,但子类的构造函数不想jvm调用父类默认的那个构造函数, 就要用spuer(...)(如果父类还有其他构造函数)

其他场景,都是可写可不写。但是一旦写了super(...),super的参数怎么给必须与父类的构造函数相符。

posted @ 2012-03-06 16:39  未来是个梦  阅读(1761)  评论(0)    收藏  举报