我一直在使用java并且学习了一个关于类中默认构造函数的问题。 Why does it call super (constructor of Object class.I know it does constructor chaining)?. For what reasons it is required
?如果我定义这样的类
MyClass
{
public MyClass()
{
}
}
编译器在构造函数中添加了super。
public MyClass()
{
super();
}
P.S我尝试使用谷歌搜索并阅读了Oracle Doc但无法找到答案。为什么? 谢谢你的时间。
答案 0 :(得分:1)
每个构造函数都必须调用同一个类的不同构造函数或其直接超类的构造函数。如果您没有明确地调用它,则会隐式添加对超类构造函数的调用。
由于类的实例继承了其祖先的状态,因此必须通过调用其祖先的构造函数来初始化它。
在您的情况下,MyClass
是Object
的直接子类,因此您的构造函数必须调用Object
的构造函数。
答案 1 :(得分:1)
一个类总是一个类链,总是以Object结尾(其中Object是唯一的异常;它没有超类)。
如果创建了一个新实例,则必须初始化链中的所有类,否则它们的状态将是未定义的。这也适用于似乎不需要初始化的类(如Object)。
初始化部分隐式完成(变量获取其默认值),而另一部分则始终在类中调用构造函数。
答案 2 :(得分:1)
为什么它调用super(Object类的构造函数。我知道它 构造函数链接)?出于什么原因需要它?
考虑这个例子:
class A {
protected String s;
A () {
this.s = "hello";
}
}
class B extends A {
public String get() {
return s;// s is inherited from A
}
}
// A's default constructor is invoked here
System.out.println(new B().get());// prints hello
让我们说现在java在构造函数中不包含super()
。
// A's default constructor is not invoked here
System.out.println(new B().get());// prints null
它将null作为类类型的默认值。由于未为B
的新实例调用A&#39}构造函数,因此A
的实例变量未初始化。