La única diferencia real está en el orden de las operaciones. Los campos que se inicializan en su declaración se evalúan antes de llamar al constructor de la clase. Los campos que se inicializan en una subclase de esta manera se evaluarán después de que se complete el constructor del super pero antes de que se invoque el constructor de la subclase.
Considere el siguiente ejemplo:
tengo una clase de prueba:
public class Tester {
Tester (String msg) {
System.out.println(this + ":" + msg);
}
}
tengo una superclase:
public class Test {
protected Tester t1 = new Tester("super init block");
Test (String constructorMsg) {
new Tester(constructorMsg);
}
}
y tengo una subclase:
Public class TestSub extends Test {
private Tester t2 = new Tester("sub init block");
TestSub(String constructorMsg) {
super(constructorMsg);
new TTester("sub constructor");
}
}
En mi main
método, se crea una instancia de TestSub
:
public static void main(String[] args) {
new TestSub("super constructor");
}
los resultados son los siguientes: ediciones
[email protected]:super init block
[email protected]:super constructor
[email protected]:sub init block
[email protected]:sub constructor
de Jon Skeet atacan de nuevo –
¿Usted también consigue el mismo código de bytes con un inicializador ejemplo? Yo diría que la respuesta es sí. –
@mmyers: Sí, exactamente lo mismo otra vez. –