Посмотрите на следующий фрагмент кода в 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();
}
}
По соглашению конструктор super() в Java должен быть первым утверждением в соответствующем теле конструктора. В приведенном выше коде мы вызываем метод static в самом списке параметров конструктора super() super (method());.
Это означает, что в вызове super в конструкторе B() используется метод называемый ПЕРЕД вызовом супер! Это должно быть запрещено компилятором, но оно работает хорошо. Это несколько эквивалентно следующим утверждениям.
String s = method();
super(s);
Однако это незаконно вызывает ошибку времени компиляции, указывающую, что "вызов super должен быть первым выражением в конструкторе". Зачем? и почему это эквивалентно super (method()); допустимо, и компилятор больше не жалуется?