Локальный внутренний класс java

Рейтинг: 2Ответов: 1Опубликовано: 25.11.2014

Изучаю java. Прочитал, что локальный внутренний класс может иметь доступ к локальным переменным, объявленных как final. Написал код:

package wtf;

public class Wtf
{
    public static void doSomething()
    {
        int k = 10; // не final!!!

        class A
        {
            void print() { System.out.println(k); }
        }

        new A().print();
    }

    public static void main(String... arg)
    {
        doSomething();
    }
}

Он работает! В чём дело?!

Ответы

▲ 8Принят

Рискну предположить, что пример компилировался в Java 8. Начиная с Java 8 появилось понятие effectively final - переменная, которая не объявлена как final, но которая не изменяется после инициализации.

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.

Внутренние классы миеют доступ как к final, так и к effectively final переменным.

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html