メソッド内で定義された内部クラスは、これらのローカル変数がマークされていない限り、メソッドのローカル変数にアクセスできませんfinal
。スタックオーバーフローとJavaコードランチの他の投稿を見ましたが、どのようにマークするかについての質問に正確に答えているものはないようです。変数finalを使用すると、内部クラスはメソッド内のローカル変数にアクセスできます。
class MyOuter {
private String x = "Outer";
void fly(final int speed) {
final int e = 1;
class FlyingEquation {
public void seeOuter()
{
System.out.println("Outer x is " + x);
}
public void display()
{
System.out.println(e);// line 1
System.out.println(speed);// line 2
}
}
FlyingEquation f=new FlyingEquation();
f.seeOuter();
f.display();
}
public static void main(String args[])
{
MyOuter mo=new MyOuter();
mo.fly(5);
}
}
私がこれに見つけた説明:
ローカル変数はスタックに格納され、メソッド呼び出しが終了するとすぐにスタックがポップアップされ、ローカル変数にアクセスできなく なりますが、最終的なローカル変数はメモリのデータセクションに格納されJVM
、メソッド呼び出しの終了後もアクセスできる可能性があります。どこにありdata section of memory
ますか?最終的なローカル変数はすべてスタックに格納されていると思います。メソッドがスタックから削除されると、最終的な変数も一緒に削除されます。最終変数の値は、オブジェクトとともにヒープに格納されますか?
メソッドまたはクラスのいずれかによって変更される可能性があるため、非最終フィールドはサポートされません。実際には2つの異なるフィールド/変数があるため、これはサポートされません。