Zugriff auf ein privates Element über ein inline erstelltes Objekt in Java

7

Ich bin neu in Java und versuche einige Methoden zum Zugriff, und ich stieß auf etwas, das ich nicht verstehe. Der folgende Code funktioniert gut, druckt 9 und gibt keine Kompilierungsfehler. Ich denke, dieser Code sollte einen Kompilierungsfehler ergeben und die Nummer sollte von der Testmethode nicht zugänglich sein, da new Human () eine Instanz einer völlig anderen Klasse ist. Kann mir jemand erklären, was hier passiert?

%Vor%

Menschliche Klasse

%Vor%     
rematnarab 22.08.2017, 12:26
quelle

2 Antworten

6

Dies ist absolut gültig (für java8 - vorher würden Sie das final Schlüsselwort benötigen, wenn Sie number deklarieren):

  • Sie erstellen eine anonyme innere -Klasse, die erweitert Mensch ist und die erforderliche Implementierung der test() -Methode bereitstellt.
  • Diese Methode verwendet eine Variable aus ihrem einschließenden "Geltungsbereich" - und der Compiler ist schlau genug, um zu erkennen, dass diese Variable tatsächlich eine Konstante ist - da es keine weiteren nachfolgenden Zuweisungen gibt.

Um Ihr Beispiel zu "ungültig machen": fügen Sie einfach eine Zuweisung hinzu

%Vor%

innerhalb der Hauptmethode - nach dem Definieren dieser anonymen inneren Klasse. Oder verwende eine Version von Java, die älter als Java8 ist.

Beachten Sie, dass anonyme innere Klassen closures sind und dass die JVM kopiert die Werte, die von "drinnen" benötigt werden. Aber wenn sich der äußere Wert ändert - welcher Wert sollte kopiert werden? Siehe hier zum weiteren Lesen.

    
GhostCat 22.08.2017, 12:37
quelle
12

Sie haben vor java 8 Recht.

  

Darüber hinaus hat eine lokale Klasse Zugriff auf lokale Variablen. Eine lokale Klasse kann jedoch nur auf lokale Variablen zugreifen, die als final deklariert sind. Wenn eine lokale Klasse auf eine lokale Variable oder einen Parameter des umschließenden Blocks zugreift, erfasst sie diese Variable oder diesen Parameter.

Lokale Variablen sollten final sein, um in anonymen Klassen zugänglich zu sein.

Beginnend mit Java 8, effektiv final Variablen dürfen auch innerhalb zugreifen.

  

In Java SE 8 kann eine lokale Klasse jedoch auf lokale Variablen und Parameter des umschließenden Blocks zugreifen, die endgültig oder effektiv final sind. Eine Variable oder ein Parameter, dessen Wert nach der Initialisierung nie geändert wird, ist effektiv endgültig.

probiere

aus %Vor%

now number ist überhaupt nicht effektiv final und Sie erhalten einen Compilerfehler, der besagt, dass "Die in einem umschließenden Bereich definierte lokale Variablennummer muss endgültig oder effektiv endgültig sein" .

Vielleicht möchten Sie lesen Unterschied zwischen final und effektiv final

    
quelle