当前位置: 首页 > 面试题库 >

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

公西承
2023-03-14
问题内容

除非标记了这些局部变量,否则在方法 内部 定义的 内部类
无法访问该方法的局部变量。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?我相信所有
final或not局部变量 都存储在堆栈中。从堆栈中删除该方法时,final变量也会随之删除。最终变量中的值是否与对象存储在堆中?

它不支持非最终字段,因为它们可以通过方法或类进行更改,并且不支持此设置,因为实际上有两个不同的字段/变量。


问题答案:

在内部类实例化期间,当方法和类都在范围内时,内部类将复制为常量的变量,这意味着方法可以超出范围,因为内部类仅使用变量的副本。
查看这篇文章。



 类似资料:
  • 在方法内部定义的内部类不能访问该方法的局部变量,除非这些局部变量被标记为。我看过stack-overflow和java code ranch中的其他文章,但它们似乎都没有确切地回答这样一个问题,即标记变量final如何允许内部类访问方法中的局部变量。 我对此的解释是: 局部变量存储在堆栈上,一旦方法调用结束,堆栈就会弹出,局部变量不可访问,而最终的局部变量存储在内存的数据部分中,这可能允许访问它们

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

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

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

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

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