java - 可运行内联类声明 - 能够访问外部非最终变量

标签 java anonymous-inner-class

在下面的代码中,我想知道为什么内联类中的 run() 能够访问外部类变量 - 信号量(即使它没有声明为final)。

    private Semaphore semaphore = new Semaphore(bufferSize);

    private Runnable producerRunnable = new Runnable(){

        @Override
        public void run()
        {
            try
            {
                semaphore.acquire();
            }
            catch(InterruptedException e)
            {
                System.out.println("producer was interrupted while trying to acquire semaphore");                   
            }
        }
   };

我预计 Eclipse 会标记编译错误 - 因为信号量引用未声明为最终的

最佳答案

这是正常的。最终要求仅描述为适用于局部变量和参数( JLS ):

Any local variable, formal parameter, or exception parameter used but not declared in an inner class must either be declared final [...].

封闭实例的成员不需要最终才能访问它们。

关于java - 可运行内联类声明 - 能够访问外部非最终变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549452/

相关文章:

Java lambda 与匿名内部类有不同的变量要求

java - 如何迭代 LoadingCache 谷歌类

java - 如何在同一个 JPanel 中实现南北部分

java - 正则表达式检查包含空格和特殊字符的字符串

java Thread.join 未按预期工作

java - 无法在 Java 中访问匿名类方法

java - 与灰熊一起运行 Jersey

java - 匿名内部类: declared as instance variables vs creating on the fly

java - 实例化通用接口(interface)

java - Java中的匿名成员类