Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
finaler Wert in outerMethod von method in InnerMethodClass
Weiß jemand wie man den Wert sum = 300 abrufen kann?
Java:
public class OuterClass {
int sum = 400;
public void outerMethod() {
final int sum = 300; // ?????
class InnerMethodClass {
int sum = 200;
public void innerMethodClassMethod() {
int sum = 100;
System.out.println("local variable of method within Inner class: " + sum);
System.out.println("Inner class variable: " + this.sum);
System.out.println("Outer class variable: " + OuterClass.this.sum);
}
}
InnerMethodClass imi = new InnerMethodClass();
imi.innerMethodClassMethod();
}
}
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
Note: Local inner class cannot access non-final local variable till JDK 1.7. Since JDK 1.8, it is possible to access the non-final local variable in method local inner class.
Hier kommen aus meiner Sicht zwei Dinge zum Tragen:
a) Ja, es ist richtig, dass auf eine (quasi) final Variable zugegriffen werden kann. Dies kann man an einem einfachen Beispiel zeigen:
Java:
public class OuterClass {
public void outerMethod() {
final int sumX = 300;
class InnerMethodClass {
public void innerMethodClassMethod() {
System.out.println("sumX: " + sumX);
}
}
}
}
Wichtig ist hier, dass man das final auch wegnehmen kann. Da es außer bei der Initialisierung nicht gesetzt wird, ist es ausreichend ("effective final" ist die Bezeichnung in der JLS).
Sobald Du aber dann eine weitere Zuweisung in der Methode vornimmst, dann fängt Java an zu meckern.
b) Zugriff auf Variablen, die versteckt wurden. Die Variable sum hast Du auf verschiedenen Ebenen. Und da gibt es dann teilweise Möglichkeiten, um die Variablen dennoch anzusprechen. Für die lokale Variable gibt es meines Wissens nach aber keine Möglichkeit.
Generell ist das auch ein Zeichen für ein sehr schlechtes Design. Sowas sollte meiner Meinung nach nicht gemacht werden. (Generell wäre ich mit so inneren Klassen innerhalb einer Methode auch etwas vorsichtiger. Das ist eher unüblich und aus meiner Sicht zumindest kein guter Stil. (Mit Java 8 sind funktionale Elemente eingeführt worden und die führen zu kürzerem und übersichtlicheren Code!)