финал для анонимного класса? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть еще один вопрос к финалу анонимного класса.

Внутри анонимного класса получите доступ к атрибутам и методам класса, в котором определен анонимный класс.

Доступ к локальным переменным метода, в котором определен анонимный класс, при условии, что они являются окончательными.Это связано с тем, что локальная переменная больше не будет существовать после завершения метода.

package a;

public class A {

private int i = 4;

public void meth() {
    System.out.println("will not use");
}

public void meth2() {
    int j = 4;
    final int k = 3;

    A a = new A() {
        public void meth() {
            System.out.println("i-4 is " + (i - 4));   
            System.out.println("j-4 is " + (j - 4));   
            System.out.println("k-4 is " + (k - 4));  
        }
    };
    a.meth();

}

public static void main(String st[]) {
    A a = new A();
    a.meth2();
  }
}

следующий результат: run: i-4 равно 0, j-4 равно 0 k-4, равно -1

в верхнем примере (я не получаю никакой ошибки и с результатом) ........ я могу получить доступ ко всем переменным и методам ???но почему говорят, что может только final и определение в подклассе, переменная больше не будет существовать без final.

1 Ответ

0 голосов
/ 25 октября 2018

Я предполагаю, что вы используете Java 8 или выше.В Java 8 и выше анонимные классы могут обращаться к локальным переменным, которые «эффективно являются окончательными», то есть они явно не объявлены final, но им никогда не присваиваются, поэтому они могут быть объявлены final.Локальная переменная j является окончательной, потому что она никогда не присваивается после инициализации, поэтому, предполагая, что это Java 8+, вы можете использовать ее в анонимном классе.Переменная i является переменной экземпляра, поэтому к ней неявно обращаются через A.this, и, следовательно, не имеет значения, является ли i окончательным или нет.

...