在 Java 中,对 super() 参数列表中的静态方法的调用是有效的。为什么?
让我们看一下 Java 中的以下代码片段。
package trickyjava;
class A
{
public A(String s)
{
System.out.println(s);
}
}
final class B extends A
{
public B()
{
super(method()); // Calling the following method first.
}
private static String method()
{
return "method invoked";
}
}
final public class Main
{
public static void main(String[] args)
{
B b = new B();
}
}
按照惯例,Java 中的 super() 构造函数必须是相关构造函数体中的第一个语句。在上面的代码中,我们在 super() 构造函数参数列表本身中调用静态方法 super(method());。
这意味着在构造函数 B() 中对 super 的调用中,在调用 super 之前调用了一个方法!编译器应该禁止这样做,但它工作得很好。这在某种程度上等效于以下语句。
String s = method();
super(s);
但是,导致编译时错误是非法的,该错误指示“对 super 的调用必须是构造函数中的第一个语句”。为什么?以及为什么它是等效的 super(method()); 是有效的,编译器不再抱怨了?