Miremos el siguiente fragmento de código en Java.Una llamada a un método estático dentro de la lista de parámetros de super() es válida en Java. ¿Por qué?
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();
}
}
Por convención, el super() constructor en Java debe ser la primera instrucción en el cuerpo del constructor correspondiente. En el código anterior, estamos llamando al método estático en la lista de parámetros del constructor super() en sí super (método());.
Esto significa que en la llamada a super en el constructor B(), está siendo llamado antes de la llamada a super se hizo un método! Esto debería estar prohibido por el compilador pero funciona bien. Esto es algo equivalente a las siguientes declaraciones.
String s = method();
super(s);
Sin embargo, es ilegal que causa un error en tiempo de compilación que indica que "llamada a super debe ser primera declaración en el constructor". ¿Por qué? y por qué es equivalente super (método()); es válido y el compilador ya no se queja?
Ver http://stackoverflow.com/questions/1168345/why-does-this-and-super-have-to-be-the-first- statement-in-a-constructor – wannik
'super' ES la primera instrucción en el constructor, a pesar de no ser llamado primero. La especificación establece que 'La primera declaración de un cuerpo constructor puede ser una invocación explícita de otro constructor ...', no que se deba llamar primero. –