Java Legal Forward-Referenzierung

Ist der folgende Code der Fall für die vorwärtsgerichtete Referenzierung? wenn ja warum?

public class MyClass { private static int x = getValue(); private static int y = 5; private static int getValue() { return y; } public static void main(String[] args) { System.out.println(x); } } 

    Der obige Code, den Sie haben, ist absolut legales Java. In Java werden statische Felder wie folgt initialisiert: Zuerst werden alle Felder auf den Standardwert für ihren Typ (0, false oder null ) festgelegt und dann in der Reihenfolge initialisiert, in der sie deklariert sind. Dies bedeutet, dass der obige Code Folgendes garantiert:

    1. Setzen Sie x und y auf Null, da dies der Standardwert für int s ist.
    2. Initialisiere x indem getValue() aufruft, das den Wert von y liest. Da y noch nicht initialisiert wurde, hat es immer noch den Wert 0.
    3. Initialisiere y bis 5.

    Das bedeutet, dass x den Wert 0 annimmt und y den Wert 5 annimmt. Dieses Verhalten ist portabel und garantiert. Sie können das hier sehen .

    Hoffe das hilft!

    Sie können sagen, ob es legal ist oder nicht, durch die Tatsache, dass es kompiliert; Im Gegensatz zu einigen anderen Sprachen hat Java nicht den Begriff “undefiniertes Verhalten”. Was hier passiert, ist komplett ausgeschrieben. Es mag zwar widersprüchlich sein, aber es ist besonders legal: Sie können auf eine statische Variable zugreifen, bevor sie von einer Methode initialisiert wird, die beim Initialisieren einer anderen statischen Variable aufgerufen wird. Der oberflächlich ähnliche Fall des direkten Zugriffs auf y aus dem Initialisierer von x

     private static int x = y; private static int y = 5; 

    ist ausdrücklich nicht erlaubt. Es gibt wirklich keinen guten Grund dafür – so ist es eben.