2013-06-14 3 views
5

der Java-Quellcode wie:Was ist die Klasse und Feld Reihenfolge des Ladens in Java?

public class Test{ 
    public static void main(String[] args){ 
     System.out.println(X.Y.Z); 
    } 
} 


class X { 
    static class Y{ 
     static String Z = "balck"; 
    } 

    static C Y = new C(); 
} 

class C{ 
    String Z = "white"; 
} 

warum ist das Ergebnis: white?

+0

Oft den ersten Code und Refactoring nehmen kann es die Lösung zeigen; Dies ist alles auf die Klasse Y und die Variable Y zurückzuführen, die beide vorhanden sind, wenn Sie die Zeile System.out.println (X.Y.Z) umstrukturiert haben. mit X -> A Y -> B und Z -> C zeigt sich das Y, das tatsächlich verwendet wird –

+1

Erwägen Sie die Verwendung einer IDE, die Sie vor Fouls warnt, wie die Verwendung von Großbuchstaben für Variablen. – AlexWien

+0

Nichts zu tun mit dem Laden und alles, was mit Scoping und Verstecken zu tun hat. – EJP

Antwort

10

Bitte beachten Sie die JLS

6.4.2. Obscuring

Ein einfacher Name kann in Kontexten auftreten, in denen möglicherweise als der Name einer Variablen, eines Typs oder eines Pakets interpretiert werden kann. In diesen Situationen geben die Regeln von § 6.5 vor, dass eine Variable einem Typ vorgezogen wird und dass ein Typ bevorzugt vor einem Paket ausgewählt wird. Daher kann es manchmal unmöglich sein, auf einen sichtbaren Typ oder eine Paketdeklaration über seinen einfachen Namen zu verweisen. Wir sagen, dass eine solche Erklärung verdeckt ist.

Unter Abschnitt 6.5.2. Reclassification of Contextually Ambiguous Names:

Wenn der Name auf der linken Seite des "" wird als eine Type-Name umklassifiziert, so gilt:

  1. Wenn die Kennung der Name einer Methode oder ein Feld des Typs von Type-Name dieses AmbiguousName bezeichnet wird als ExpressionName reklassifiziert.

  2. Wenn der Bezeichner der Name eines Elementtyps des Typs TypeName ist, wird dieser AmbiguousName andernfalls als TypeName neu klassifiziert.

  3. Andernfalls tritt ein Fehler bei der Kompilierung auf.

+4

+1 für die JLS-Referenz :-) Konnte es dort nicht finden. –

4

Ihre innere Klasse und statische Variablen sind gleich benannt. Es muss nichts mit der Reihenfolge des Ladens der Klasse zu tun haben, X.Y wird als ein Zugriff auf die Variable interpretiert, nicht die innere Klasse.

2

Dies ist eine Trickfrage. Die Klasse Y wird nie verwendet, static C Y = new C(); ist eine Instanz der Klasse C namens Y und hat nichts mit der Klasse Y

4

Das Ergebnis zu tun ist, white, weil Ihre Namenskonvention extrem schlecht ist.

Unabhängig von den technischen Gründen, die andere Personen Ihnen gegeben haben, ist der einzige Grund, auch nur an das Problem zu denken, dass Sie Ihre Variablen so benannt haben, dass Sie selbst und alle anderen Menschen Probleme beim Lesen und Verstehen haben . Und das einzige, was keine Probleme haben wird, ist der Compiler, der streng genug definiert ist, um zu wissen, was zu tun ist.

+5

Ich hoffe verzweifelt, dass dies ein Puzzle ist, keine wirkliche Art, wie echter Code geschrieben wurde –

Verwandte Themen