explicar el orden de compilación de java

v2 es nulo cuando ingresa el código de A por primera vez, pero si pongov2Declaració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 cambiov2La 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

Respuestas a la pregunta(1)

Su respuesta a la pregunta