окончательный для анонимного класса?

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

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

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

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.


person andy    schedule 20.09.2018    source источник


Ответы (1)


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

person newacct    schedule 24.10.2018
comment
большое спасибо, в анонимном классе, как j, так и k, которые фактически являются окончательными и окончательными, хорошо для доступного его атрибута. и переменная экземпляра класса, будет иметь доступ к классу A для всех, а meth() в анонимном классе не просматривается в классе, поэтому его можно использовать как одно и то же имя функции. эм я правильно понимаю? спасибо - person andy; 26.10.2018