2016-07-18 19 views
-1

Ich habe eine lokale Klasse in einer Methode deklariert, deren Felder als privat deklariert sind. Ich bin jedoch immer noch in der Lage, direkt vom Körper der umschließenden Methode darauf zuzugreifen - warum ist das?Zugriffskontrollmodifikatoren in lokalen Klassen - warum funktionieren sie nicht?

Als Nebenbemerkung habe ich alle Felder in einer anonymen Klasse als privat deklariert, aber gibt es tatsächlich einen Vorteil dabei? Konnte irgendetwas auf sie zugreifen?

Edit: Codebeispiel

public void myMethod() { 

    class myException extends SomeOtherException{ 
     private boolean Bool; 

     public Boolean getBool() { return this.Bool; } 

     public myException() { //constructor stuff } 
    } 

    try { 
     Thing.setHandler(new HandlingClass() { 
      private String myString; //What is the point in making these private? 

      ... other methods in anonymous class ... 
     } 
    ... more code ... 
    } catch (myException e) { 
     ... e.Bool //Can be accessed. Why? 
    } 
} 
+0

Bitte fügen Sie Code. – Fildor

+0

Making 'myString' ** private dient keinen Zweck **; das Reflexionsverhalten ist etwas anders (wenn ein SecurityManager installiert ist). Beachten Sie, dass Sie 'new HandlingClass() {...} .myString' machen können –

Antwort

0

Der Grund, warum es zugegriffen wird, weil es in ähnlicher Weise wie die verschachtelten Klassen zugegriffen wird. Gemäß Ihrer Methode sind die lokalen Klassenattribute sichtbar, es wäre dasselbe gewesen, wenn es sich um eine geschachtelte Klasse handelte. Hier

ist ein Fragment von Java-Dokumentation auf dem lokalen Klassen:

Zugriff auf Mitglieder einer umschließenden Klasse

Eine lokale Klasse Zugriff auf die Mitglieder ihrer umgebenden Klasse hat.

Darüber hinaus hat eine lokale Klasse Zugriff auf lokale Variablen. Eine lokale Klasse kann jedoch nur auf lokale Variablen zugreifen, die als final deklariert sind. Wenn eine lokale Klasse auf eine lokale Variable oder einen Parameter des umschließenden Blocks zugreift, erfasst sie diese Variable oder diesen Parameter. Zum Beispiel kann der PhoneNumber-Konstruktor auf die lokale Variable numberLength zugreifen, da sie als final deklariert ist; numberLength ist eine erfasste Variable.

jedoch ausgehend in Java SE 8 kann eine lokale Klasse zugreifen lokale Variablen und Parameter des einschließenden Blockes, die End- oder effektiv abschließend sind. Eine Variable oder ein Parameter, dessen Wert nach der Initialisierung nie geändert wird, ist effektiv endgültig.

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html