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% Dies ist absolut gültig (für java8 - vorher würden Sie das final
Schlüsselwort benötigen, wenn Sie number
deklarieren):
test()
-Methode bereitstellt. 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.
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
Tags und Links java java-8 oop inline abstract-methods