package HighNewTech; public class Parent { private String name= null; private int age = 0; Parent(String name,int age){ System.out.println("ssssss"); } Parent(){ System.out.println("ssssss"); } } class Child extends Parent{ private String name = null; private int age = 0; // Son(String name,int age){ //// super(); //// super(name,age); // } }
先理解一个对象的实例化过程即可。
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的参数怎么给必须与父类的构造函数相符。
总结:只要父类有带参的构造函数,在子类中就必须显式的调用父类的构造函数,因为子类的构造器实例化的时候无法找到父类的构造函数(父类中有自己写的无参的构造函数时子类也不用显示的调用)。