внутренний класс, определенный внутри метода, не может получить доступ к локальным переменным метода, если только эти локальные переменные не отмечены final
. Я рассматривал другие сообщения в раннем переполнении стека и ранжирования java-кода, но ни один из них, похоже, точно отвечают на вопрос о том, как окончательные обозначения переменных позволяют внутреннему классу обращаться к локальным переменным в методе.
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);
}
}
Пояснения: Я нашел следующее:
локальные переменные хранятся в стеке, и как только вызов метода заканчивается, стек выставляется, а локальные переменные недоступны, тогда как конечные локальные переменные strong > хранятся в разделе данных памяти, что позволяет JVM
получить к ним доступ даже после завершения вызова метода. Где находится data section of memory
? Я считаю, что все локальные переменные final или not хранятся в стеке. Когда этот метод удаляется из стека, конечная переменная будет удалена вместе с ним. Является ли это тем, что значение в конечной переменной хранится с объектом в куче?
Он не поддерживает нефинализированные поля, поскольку они могут быть изменены либо методом, либо классом, и это не поддерживается, поскольку на самом деле существует два разных поля/переменных.