据我所知,Constructor Chaining就是那个
每当我们创建子类的对象(或调用子类构造函数)时a 父类的默认构造函数的调用首先自动生成仅 我们的子构造函数不会使用 this (对于同一个类)或 super 关键字调用另一个构造函数。来源:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html
所以,如果我的理解是正确的
然后是以下代码: -
Class First{
First(){
System.out.print("Hello");
}
Class Second extends First{
Second(int i)
{
System.out.println("Blogger");
}
Second(){
this(2); //default constructor is calling another constructor using this keyword
}
public static void main(String[] args)
{
Second ob = new Second();
}
输出应仅为Blogger
。
但输出为HelloBlogger
所以看起来父类的默认构造函数仍然被调用。 但引用该来源: -
2)如果你没有从父类或同一个类调用另一个构造函数,而不是Java调用default或没有超类的参数构造函数。
了解详情:http://www.java67.com/2012/12/how-constructor-chaining-works-in-java.html#ixzz4qztuMrKW
所以请帮忙!
答案 0 :(得分:5)
是的,默认构造函数只调用this(int)
,但this(int)
隐式调用super()
。不能使最终调用某种形式的super()
的构造函数成为可能。
答案 1 :(得分:5)
基本规则是,超类构造函数的这种或那种方式始终被调用。这条规则没有技巧*并且有充分理由:子类依赖于超类的状态,因此如果超类未初始化,则子类行为不正确。 (例如,可以考虑继承的protected
字段。)
如果你向super(...)
添加一个显式调用(你可以选择在这里调用哪个超级构造函数),那么将调用它,否则将从任何地方隐式调用super()
(没有参数)不使用this(...)
调用另一个的构造函数。
在您的情况下,链条如下:Second() -> Second(int) -> First()
。第一个调用是显式的(this(2)
),第二个调用是隐式的。
*对于nitpickers,如果您使用反序列化或Unsafe
,则此声明显然不正确。 :)