事实上,除了匿名内部类参数,方法和作用域内的内部类内部使用的外部变量也必须是final 的。原因大致总结一下:
简单解释就是:
方法中的局部变量的生命周期很短,方法结束后变量就要被销毁,加上final是为了延长变量的生命周期。
进一步解释:
内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以回调的时候一定可以访问到。
程序示例:
private Animator createAnimatorView(final View view, final int position) { MyAnimator animator = new MyAnimator(); animator.addListener(new AnimatorListener() { @Override public void onAnimationEnd(Animator arg0) { Log.d(TAG, "position=" + position); } }); return animator; }
匿名内部类回调里访问position的时候createAnimatorView()早就执行完了,position如果不是final的,回调的时候肯定就无法获取它的值了,因为局部变量在函数执行完了以后就被回收了。所以java干脆把这样的变量设计成final,一旦初始化,就必须不能改变!这样保证任何时候进行回调都能得到所需的值。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
问题内容: 我不明白为什么我不能总是从“侦听器”或“处理程序”内部访问变量。 这是我的代码: 唯一的方法是使用关键字声明它: 为什么需要声明变量 final 以获取事件内部的访问权限? 问题答案: 您是一个匿名内部类,我认为这很清楚: 本地类绝对可以引用实例变量。它们无法引用非最终局部变量的原因是,方法返回后,局部类实例可以保留在内存中。当该方法返回时,局部变量超出范围,因此需要它们的副本。如果变
问题内容: 这个问题已经在这里有了答案 : 匿名内部类显示不正确的修饰符 (4个答案) 去年关闭。 据我正确理解 总是: 这已经在 但是,当我运行以下代码来检查它是否显示该类不是。 上面程序的输出是: 请清除我的疑问,因为我无法理解此行为。 问题答案: 显式 是在源代码中写的东西。因此,如果将某些东西声明为,则意味着该类是 明确的final 。 隐式 不是在源代码中写下的,而是在某种构造的上下文中
在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。
问题内容: 我目前正在与Sierra&Bates一起准备S(O)CJP。 关于内部类(局部或匿名方法),他们说我们无法访问局部变量,因为它们在类驻留在堆上时仍位于堆栈中,并且可以由方法返回,然后尝试访问这些变量由于该方法已结束,因此它们已在堆栈中,但已不存在… 众所周知,我们可以使用final关键字来绕开它。这就是他们在书中所说的,但是他们并没有真正解释final关键字的作用……据我所知,在方法局
问题内容: 就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示: 定义类: 使其成为一个实例: 并称之为: 很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。 问题答案: 不,您说的是MyCa
问题内容: 我读了一些有关闭包的文章,到处都看到了,但是没有明确的解释-每次我被告知要使用它时……: 好的,我看到我们将创建一个新的匿名函数,然后执行它。因此,在此之后,此简单的代码应该可以工作了(并且可以): 我的问题是这里发生了什么魔术?我以为在写的时候: 然后将创建一个新的未命名函数,如函数“”(msg)… 为什么它需要在同一行? 您能给我一些帖子或给我一个解释吗? 问题答案: 将分号放在函
问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?
在java中,我们有一些方法来实现一些逻辑。那么匿名函数有什么用呢?当我们真的需要匿名函数时。