java在调用基类构造函数之前,编译器是否在子类构造函数中查找**super**关键字?
我在同一个包中有以下课程:
class Moo
{
Moo()
{
System.out.println("No-Arguments Base Constructor!");
}
Moo(int a)
{
System.out.println("Parameterized Base Constructor!");
}
public String coolMethod()
{
return "Wow!";
}
}
class Zoo extends Moo
{
Zoo()
{
super(10);
System.out.println("SubClass Constructor!");
}
public String coolMethod()
{
return "Zoo Wow!";
}
public static void main(String[] args)
{
Zoo m = new Zoo();
System.out.println(m.coolMethod());
}
}
输出如下所示:
Parameterized Base Constructor!
SubClass Constructor!
Zoo Wow!
我知道的是,“每当我们运行一个程序,编译器都会在执行子构造函数之前执行基类默认构造函数”。 但在本例中,首先调用参数化构造函数(而不是默认构造函数)
所以我的问题是,在执行基类构造函数之前,编译器是否在子类构造函数中查找super关键字
# 1 楼答案
这是错误的:“[…]编译器将在执行子构造函数之前执行基类默认构造函数“
更好地解释:除了类型
java.lang.Object
之外,每个构造函数必须在其第一个语句中调用另一个构造函数。这可能是同一类中的构造函数(使用this(...)
),也可能是超类中的构造函数(使用super(...)
)如果您不恰当地指定了另一个构造函数,那么将执行该构造函数。如果不指定它,编译器将自动调用
super()
(不带arg)在你的例子中
您用一个参数显式地调用了超类构造函数。因此,不会调用no-arg构造函数
另一方面,如果你写了
那么输出就会是
请记住,编译器随后生成的字节码如下所示:
# 2 楼答案
由于在子类构造函数中指定了带有参数的super关键字,因此它将转到基类中的参数化构造函数
否则将执行默认构造函数