2016-07-11 4 views
0

Этот пример не компилируется:Доступ частного поля внутри класса отказывается компилировать

public class Test{ 
    private LinkedList<Integer> lst = new LinkedList<>(); 

    public static Test of(int i){ 
     return new Test(){{ 
      this.lst.addFirst(i); 
     }}; 
    } 
} 

DEMO

Но это делает:

public class Test{ 
    private LinkedList<Integer> lst = new LinkedList<>(); 

    public static Test of(int i){ 
     Test t = new Test(); 
     t.lst.addFirst(i); 
     return t; 
    } 
} 

DEMO

Почему? В обоих случаях мы получаем доступ к частному члену из тела класса.

ответ

5

С кодом

new Test() { ... } 

вы на самом деле объявить и создать экземпляр неизвестным подкласс из Test. А подкласс просто не имеет доступа к частным членам его родителя.

См JLS §15.9 (Class Instance Creation Expressions) и JLS §15.9.5 (Anonymous Class Declarations) для получения дополнительной информации

1

При определении:

return new Test(){{ 
     this.lst.addFirst(i); 
}}; 

создается анонимный суб класс Test. Спецификатор доступа lst - private. Таким образом, вы не можете получить доступ к элементу private класса super класса sub. Таким образом, вы получаете ошибку компиляции.

Но когда вы объявляете:

Test t = new Test(); 
t.lst.addFirst(i); 

Вы получаете доступ к закрытому члену lst внутри метода т.е. public static Test of(int i) класса, к которому принадлежит частный член. Таким образом, вы не получаете ошибку компиляции.

Смежные вопросы