Почему анонимный класс не может получить доступ к закрытым методам и переменным? - PullRequest
0 голосов
/ 27 марта 2020
package demo;

class Child{
    private static int a=50;
    public void fin() {
        System.out.println("hello");
    }
    private void fly() {
        System.out.println("lol");
    }
}

public class Hello {
    public static void main(String[] args) 
    {  
        Child c=new Child() {

            public void f() {
                System.out.println("sorry"+a);
            }
            public void fin() {
                System.out.println("hello");

            }

        };
        c.fin();

}}

Выше приведен код java Я хочу сказать, почему нельзя вызывать частные методы и переменные в анонимном классе, поскольку я где-то читал, что анонимный класс может обращаться ко всем членам вложенного класса.
https://www.baeldung.com/java-anonymous-classes go извлечение, которое указывает, что каждый член анонимного класса может получить доступ ко всем членам вложенного класса.

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Тот факт, что вы анонимно переопределяете класс, не имеет значения для ситуации. Класс не может получить доступ к private членам своего родителя. Если вы хотите получить доступ к членам родителя, вы можете определить их с protected или видимостью по умолчанию.

1 голос
/ 27 марта 2020

я где-то читал, что анонимный класс может получить доступ ко всем членам вложенного класса.

Я предполагаю, что вы имеете в виду включающий класс, и да. Однако Child это не включающий класс, это родительский класс. Класс включения в вашем случае будет Hello.class, и если вы добавите к нему private static int a;, то есть:

public class Hello {
    private static int a = 40;
...

Это будет работать.

1 голос
/ 27 марта 2020

В этом коде путаница в отношении "внутреннего класса" и "анонимного класса".

Обратите внимание, что у вас есть 3 класса:

  • Child
  • Hello
  • Hello$1: анонимный класс, объявленный внутри Hello и родительский элемент которого Child

Путаница в коде связана с последним:

  • Hello$1 является подклассом Child
  • Hello$1 является внутренним классом Hello

Это означает:

  • Hello$1 не может получить доступ к закрытым полям из Child, поскольку подклассы не могут получить доступ к закрытым элементам своих суперклассов
  • Hello$1 могут получить доступ к закрытым полям из Hello, как анонимный внутренний классы могут получить доступ к закрытым элементам своих включающих классов

Проверьте это более четко в этом коде:

class Child {
    private int a = 50;
}

public class Hello {
    private int b = 60;

    public void f() 
    {  
        Child c = new Child() {
            public void f() {
                // System.out.println("a = " + a); // This won't compile
                System.out.println("b = " + b); // This compiles OK
            }
        };
    }
}

...