2016-07-11 5 views
0

Dieses Beispiel zu kompilieren nicht kompilieren:Zugriff auf einen privaten Bereich innerhalb der Klasse verweigert

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

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

DEMO

Aber das tut:

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

Warum? In beiden Fällen greifen wir auf ein privates Mitglied des Klassenkörpers zu.

Antwort

1

Wenn Sie definieren:

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

Sie eine anonyme Unterklasse von Test erstellen. Der Zugriffsspezifizierer von lst ist private. Sie dürfen also nicht auf ein private Mitglied der super Klasse aus einer sub Klasse zugreifen. So bekommst du einen Kompilierungsfehler.

Aber wenn man erklären:

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

Sie sind das private Element lst aus innerhalb einer Methode heißt public static Test of(int i) der Klasse Zugriff auf die die privaten Mitglied gehört. Sie erhalten also keinen Kompilierungsfehler.

Verwandte Themen