2016-07-18 16 views
-1

У меня есть локальный класс, объявленный в методе, поля которого объявлены как закрытые. Тем не менее, я все еще могу получить к ним доступ непосредственно из тела прилагаемого метода - почему это?Модификаторы контроля доступа в местных классах - почему они не работают?

В качестве побочного примечания я объявлял все поля в анонимном классе приватными, но действительно ли есть какая-либо польза в этом? Может ли им что-нибудь получить?

Edit: пример кода

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

Пожалуйста, добавьте код. – Fildor

+0

Выполнение 'myString' ** private не предназначено **; поведение отражения немного отличается (если установлен SecurityManager). Разумеется, вы можете сделать 'new HandlingClass() {...} .myString' –

ответ

0

Причина, почему это происходит потому, что доступ к нему осуществляется доступ подобным образом к Вложенные классы. В соответствии с вашим методом атрибуты локального класса видны, это было бы одинаково, если бы это был класс Nested.

Вот фрагмент из Java документации по местным классам:

Доступ пользователи объемлющего класс

Локальный класс имеет доступ к членам его заключающий класса.

Кроме того, локальный класс имеет доступ к локальным переменным. Однако локальный класс может получить доступ только к локальным переменным, объявленным окончательным. Когда локальный класс обращается к локальной переменной или параметру блока-объекта , он фиксирует эту переменную или параметр. Например, конструктор PhoneNumber может получить доступ к локальной переменной numberLength , поскольку он объявлен окончательным; numberLength - захваченная переменная.

Однако, начиная с Java SE 8, локальный класс может получить доступ к локальным переменным и параметрам блока ограждающего, которые являются окончательными или эффективно окончательными. Изменена переменная или параметр, значение которого никогда не изменяется после его инициализации.

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