1. 如果子类的构造函数第一行写了this()调用了本类其他构造函数,那么super调用父类的语句就没有了。因为this()或者super()只能定义在构造函数的第一行,因为初始化动作要先执行。
public class Fu {
Fu()
{
System.out.println("Fu的无参构造函数");
}
}
public class zi extends Fu {
zi()
{
System.out.println("zi 的无参构造函数");
}
zi(int x)
{
this();
System.out.println("zi 的有参构造函数");
}
}
public class test {
public static void main(String[] args) {
zi z=new zi(3);
}
}
结果:Fu的无参构造函数
zi 的无参构造函数
zi 的有参构造函数
上面这个例子,虽然有this(),那么该构造函数里就没有super()了,但是this()调用了zi的无参构造函数,这个函数里是有super()的,反正保证了至少有一个子类有隐式super()。
2.
问题:子类构造函数有super(),那么父类构造函数里有没有隐式的super()呢?
答案:有。只要是构造函数默认第一行都是super()。
问题:父类的父类是什么呢?父类默认的super()调用的是谁的构造函数呢?
答案:Java体现在设计时,定义了一个所有对象的父类Object。
总结:
类中的构造函数默认第一行都有隐式的super()语句,用来访问父类的构造函数。
所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super()语句没有对应的构造函数,必须在构造函数中通过this或者super的形式声明调用的构造函数。