当前位置: 首页 > 知识库问答 >
问题:

将变量标记为final如何允许内部类访问它们?

王修为
2023-03-14

在方法内部定义的内部类不能访问该方法的局部变量,除非这些局部变量被标记为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字段,因为它们可以通过方法或类进行更改,这不受支持,因为实际上有两个不同的字段/变量。

共有1个答案

狄峰
2023-03-14

在内部类的实例化过程中,当方法和类都在作用域内时,内部类将复制作为常数的变量,这意味着方法可以超出作用域,因为内部类只使用变量的副本。看看这篇文章。

 类似资料:
  • 问题内容: 除非标记了这些局部变量,否则在方法 内部 定义的 内部类 无法访问该方法的局部变量。我已经看过堆栈溢出和Java代码牧场中的其他文章,但它们似乎都无法准确回答标记的问题变量final允许内部类访问方法中的局部变量。 我发现的解释是: 局部变量 存储在堆栈中,方法调用完成后,将弹出堆栈,并且 局部变量 不可访问,而 最终局部变量 存储在 内存的数据部分中,即使在方法调用结束后,也可能允许

  • 但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。

  • 我得到了一个问题,对内部类的局部变量访问需要声明为final。从方法createGrids()->“”中,i是一个需要声明为final的局部变量。我不知道为什么,我在字段中添加了final,但它并不起作用。 //略

  • 我正在尝试创建一个布局为“是”或“否”的警报对话框。我想通过单击“否”按钮而不是对话框视图来关闭该对话框。Disclose() 有错误。 这是我的密码。

  • 问题内容: 这不是直截了当的问题。在我的情况下,外部类变量和内部类setter方法的参数名称相同。喜欢: 现在,我无法初始化外部类实例变量p,因为它指示内部类。再次,我做不到它得到一个错误。现在如何分配外部p,同时将内部Class方法的参数命名为p? 问题答案: 这是您可以/应该这样做的方式:

  • 这不是直截了当的问题。在我的例子中,外部类变量和内部类setter方法的参数名称是相同的。比如: 现在我不能用初始化外部类实例变量p,因为它指示内部类。同样,我不能执行会出现错误。现在,我如何分配外部p,使内部类方法的参数与名称p相同?