1
.父类无参构造方法,子类不写,其实会默认调用父类的无参构造方法也就是用
super
()。 编译运行后,会打印出
"子类会调用Father的第一个构造方法"
class Father{
Father(){
System.out.println("子类会调用Father的第一个构造方法");
}
}
class Son extends Father{
//我没在这写子类的构造方法,但是编译器默认补上子类构造方法,这里相当于有个Son(){super(); }方法,当然这个super()不写也一样
}
class Demo{
public static void main(String[] args)
{
Son s = new Son();
}
}
2.但是注意了,下面代码无法通过编译。 因为父类重写了构造方法,编译器是不会补上无参构造方法的。子类不重写构造方法,系统会为子类默认补上无参构造方法Son(){
super
(); } ,注意这个
super
()调用的是父类的无参构造方法。 这正好和第一句矛盾了,父类没有无参数构造方法子类无法调用到的。怎么解决,看第三条。
class Father{
//父类的有参数构造方法
Father(String name){
System.out.println("子类会调用Father的有参数构造方法");
}
}
class Son extends Father{
}
class Demo{
public static void main(String[] args)
{
Son s = new Son();
}
}
3
.在第二条基础上,子类重写构造方法传入的string字串,并且显式的用
super
(name);调用父类的构造方法,既然你都显式用
super
(name);了编译器就不会多事给子类补上
super
(); 这回就编译运行正常了。
class Father{
Father(String name){
System.out.println("子类会调用Father的第二个构造方法");
}
}
class Son extends Father{
Son(String name){
super(name);
}
}
class Demo{
public static void main(String[] args)
{
Son s = new Son("接第二条");
}
}
4
.总之:
a.涉及构造方法,你不写构造方法,编译器会默认写上无参构造方法,你写编译器就完全不管事了。
b.执行子类的构造方法前一定是执行父类构造方法的(构造方法用来初始化的,没爸爸怎么来儿子),所以子类的构造方法中一定是先执行父类的构造方法用super()。
c.这个super
和a说的一样,你不显式写出来,编译器默认用
super(),也就是调用父类的无参构造方法,那你父类肯定得有无参构造方法吧。所以我们写上一个父类带参构造方法的时候,另外手动补上个无参构造方法要好些。