explicar el orden de compilación de java
v2
es nulo cuando ingresa el código de A por primera vez, pero si pongov2
Declaración e inicialización antesinstance
tendrá un valor; ¿Por qué es esto?
public class A {
private static final String v1 = new String(new byte[]{'a', 'b'});
private static A instance = new A();
private static final String v2 = new String(new byte[]{'b', 'c'});
private A() {
System.out.printf("A c'tor\tv1 [%s]\tv2 [%s]\n", v1, v2);
}
public static void main(String[] args) {
System.out.println("start main");
new A();
System.out.println("end main");
}
}
salida:
A c'tor v1 [ab] v2 [null]
start main
A c'tor v1 [ab] v2 [bc]
end main
Además, si cambiov2
La inicialización de ser en su lugar:
private static final String v2 = "ab";
se inicializav2
, y la salida es:
A c'tor v1 [ab] v2 [ab]
start main
A c'tor v1 [ab] v2 [ab]
end main
Editar
Otra prueba para la segunda parte:
public class A {
private static final String v1 = new String(new byte[]{'a', 'b'});
private static transient A instance = new A();
private static final String v2 = new String(new byte[]{'b', 'c'});
private static final String v3 = new String("ab");
private static final String v4 = "ab";
private A() {
System.out.printf("A c'tor\tv1 [%s] v2 [%s] v3 [%s] v4 [%s]\n", v1, v2, v3, v4);
}
public static void main(String[] args) {
System.out.println("start main");
new A();
System.out.println("end main");
}
}
salida:
A c'tor v1 [ab] v2 [null] v3 [null] v4 [ab]
start main
A c'tor v1 [ab] v2 [bc] v3 [ab] v4 [ab]
end main