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

为什么说“不能在用不同方法定义的内部类中引用非最终变量i”?

伏德义
2023-03-14
问题内容

我有按钮单击侦听器,并且在onCreate()方法中我有一个局部变量,例如

 onCreate() {

 super.onCreate();

 int i = 10;

 Button button = (Button)findViewById(R.id.button);

 button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            i++;
        }   
    });

为什么Java要求让我最终决定?


问题答案:

当onCreate()方法返回时,您的局部变量将从堆栈中清除,因此它们将不再存在。但是匿名类对象new
View.OnClickListener()引用了这些变量。当然,这是错误的行为,因此Java不允许您执行此操作。

最终确定后,它将成为一个常数。因此它存储在堆中,可以在匿名类中安全使用。



 类似资料:
  • 问题内容: 编辑:我需要更改几个变量的值,因为它们在计时器中运行了几次。我需要在每次迭代中通过计时器不断更新值。我无法将值设置为,因为这将阻止我更新值,但是我遇到了在下面的第一个问题中描述的错误: 我以前写过下面的内容: 我收到错误消息“无法引用用其他方法定义的内部类内部的非最终变量”。 对于名为的价格和名为的,这种情况正在发生。你知道我为什么会遇到这个问题吗?我不明白为什么我需要作最后声明。另外

  • 问题内容: 关于编译器错误,有一些关于Stack Overflow的主题,解决方案是“将其声明为最终的,您就完成了”,但是对于这个 理论性的 问题,我想检查一下该代码无法编译的逻辑原因是什么: (解决方案:声明为final),而这一点却做到了: 我真的很困惑 不是最终值,它可以多次更改,而的可怜参数只能在其方法体内更改,而是由编译器负责;) 甚至编译器错误也误导了我。: 与什么不同?与内部类不是在

  • 我将简单类添加到我的应用程序中: 应用程序应该使用这个类中的一个对象。当我在活动中使用它时: I get error:无法在不同方法Presmena中定义的内部类中引用非最终变量Asortion。JAVA帮助理解,什么是错的

  • 问题内容: 我对内部类和lambda表达式有些困惑,我试图问一个问题,但随后又产生了一个疑问,发布另一个问题可能比评论前一个问题更好。 直截了当:我知道这样的东西不会编译 由于Java如何管理闭包,因为它不是 [有效地]最终的 ,依此类推。 但是,这怎么允许呢? 不等于?在第二种情况下,我是否不会面临“使用过时的变量”的风险? 我的意思是,在后一种情况下,执行后仍然具有过期的副本(即引用旧对象)。

  • 问题内容: 我需要更改几个变量的值,因为它们在计时器中运行了几次。我需要通过计时器在每次迭代中不断更新值。我无法将值设置为final,因为这将阻止我更新值,但是我遇到了在下面的的错误: 无法引用用其他方法定义的内部类内部的非最终变量 问题答案: Java不支持真正的闭包,即使使用像你在此使用的匿名类()看起来就像一种闭包。 这就是为什么它不起作用的原因: 变量和价格是方法中的局部变量。你使用匿名类

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。