【发布时间】:2015-01-28 11:48:30
【问题描述】:
我试图理解
为什么 this() 和 super() 不能一起使用?
我已经阅读了许多关于 stackoverflow 的相关讨论,并且理解了很多东西。但我仍然有一个困惑。
在构造函数中调用 this() 会隐式调用 super()
考虑一下这段代码..
class Top
{
int z;
Top()
{
System.out.println("Top default constructor");
}
}
class A extends Top
{
int x;
A(int num)
{
x=num;
System.out.println("A parameterized constructor");
}
A()
{
this(5);
System.out.println("A default constructor");
}
public static void main(String arg[])
{
new A();
}
}
输出是:
顶级默认构造函数
参数化构造函数
默认构造函数
我没想到输出“顶级默认构造函数”中的第一行,因为没有隐式或显式的 super() 调用。
所以,我可能误解了一些东西。请解释一下。
【问题讨论】:
-
Simpe 规则:构造函数中的第一条语句必须是对另一个构造函数的调用——在同一类 (
this(...)) 或父类 (super(...)) 中。如果省略显式构造函数调用,编译器将自动生成对super()的隐式调用 - 无参数父构造函数 - 作为第一条语句。 -
其实有一个隐式的 super() 调用。它没有明确写下来,但它是隐含的(按标准)
-
警告! “默认构造函数”是当类中没有显式构造函数时,编译器在类中添加的隐式构造函数。如果在类中添加构造函数,则隐含的构造函数就会消失。 Top(){} 和 A(){} 不是默认构造函数,没有参数构造函数,是不同的!默认构造函数具有与类相同的访问修饰符,无参数,并且在其第一行具有 super()。你看不到它,它是在编译时添加的。
标签: java class constructor