Vor Java 8 konnte eine innere Klasse nur auf äußere Objekte zugreifen, wenn sie als final deklariert wurden. Aber jetzt, wenn ich Beispielcode (von unten) auf JavaSE 1.8 ausführen, gibt es keinen Kompilierungsfehler und Programm läuft gut.Anonyme Klassen können auf nicht-finale äußere Objekte in Java 8 zugreifen?
Warum haben sie das geändert und wie funktioniert es jetzt?
Beispiel-Code von Java 7 Tutorial:
public class MOuter {
private int m = (int) (Math.random() * 100);
public static void main(String[] args) {
MOuter that = new MOuter();
that.go((int) (Math.random() * 100), (int) (Math.random() * 100));
}
public void go(int x, final int y){
int a = x + y;
final int b = x - y;
class MInner{
public void method(){
System.out.println("m is "+m);
System.out.println("x is "+x); // supposedly illegal - 'x' not final
System.out.println("y is: "+y);
System.out.println("a is "+a); // supposedly illegal? - 'a' not final
}
}
MInner that = new MInner();
that.method();
}
}
Was JB sagte. Es ist jetzt "effektiv endgültig". Es wurde hinzugefügt, um lambdas in Java 8 besser zu unterstützen (die wie Verschlüsse sind, aber ein wenig anders). – markspace
[Unterschied zwischen final und effektiv final] (http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final) – alex