在方法内部定义的内部类不能访问该方法的局部变量,除非这些局部变量被标记为final
。我看过stack-overflow和java code ranch中的其他文章,但它们似乎都没有确切地回答这样一个问题,即标记变量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
访问它们,即使在方法调用结束之后也是如此。内存的数据部分
在哪里?我相信所有局部变量final或not都存储在堆栈中。当方法从堆栈中移除时,最终变量也会随之移除。是最终变量中的值与堆中的对象一起存储吗?
它不支持非final字段,因为它们可以通过方法或类进行更改,这不受支持,因为实际上有两个不同的字段/变量。
在内部类的实例化过程中,当方法和类都在作用域内时,内部类将复制作为常数的变量,这意味着方法可以超出作用域,因为内部类只使用变量的副本。看看这篇文章。
问题内容: 除非标记了这些局部变量,否则在方法 内部 定义的 内部类 无法访问该方法的局部变量。我已经看过堆栈溢出和Java代码牧场中的其他文章,但它们似乎都无法准确回答标记的问题变量final允许内部类访问方法中的局部变量。 我发现的解释是: 局部变量 存储在堆栈中,方法调用完成后,将弹出堆栈,并且 局部变量 不可访问,而 最终局部变量 存储在 内存的数据部分中,即使在方法调用结束后,也可能允许
但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。
我得到了一个问题,对内部类的局部变量访问需要声明为final。从方法createGrids()->“”中,i是一个需要声明为final的局部变量。我不知道为什么,我在字段中添加了final,但它并不起作用。 //略
我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮而不是对话框视图来关闭该对话框。Disclose() 有错误。 这是我的密码。
问题内容: 这不是直截了当的问题。在我的情况下,外部类变量和内部类setter方法的参数名称相同。喜欢: 现在,我无法初始化外部类实例变量p,因为它指示内部类。再次,我做不到它得到一个错误。现在如何分配外部p,同时将内部Class方法的参数命名为p? 问题答案: 这是您可以/应该这样做的方式:
这不是直截了当的问题。在我的例子中,外部类变量和内部类setter方法的参数名称是相同的。比如: 现在我不能用初始化外部类实例变量p,因为它指示内部类。同样,我不能执行会出现错误。现在,我如何分配外部p,使内部类方法的参数与名称p相同?