2016-07-18 10 views
-1

메소드에 선언 된 로컬 클래스가 있습니다. 필드는 private로 선언됩니다. 그러나, 나는 여전히 그들을 둘러싼 방법의 몸체에서 직접 접근 할 수있다. 왜 이럴까?로컬 클래스의 액세스 제어 수정 자 - 작동하지 않는 이유는 무엇입니까?

부수적으로 익명 클래스의 모든 필드를 비공개로 선언했지만 실제로이 작업에 어떤 이점이 있습니까? 아무것도 액세스 할 수 있습니까?

편집 :이 중첩 된 클래스와 비슷한 방식으로 액세스 할 수 있기 때문에 코드 예제

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 클래스 인 경우 동일한 것입니다. 로컬 클래스가 둘러싸는 클래스의 멤버에 액세스 할 수있는 포함되어있는 클래스

액세스 회원 : 여기

로컬 클래스에 자바 문서에서 조각입니다.

또한 로컬 클래스는 로컬 변수에 액세스 할 수 있습니다. 그러나 로컬 클래스는 final로 선언 된 로컬 변수에만 액세스 할 수 있습니다. 로컬 클래스가 블록을 둘러싸는 로컬 변수 또는 매개 변수에 액세스 할 때 해당 변수 또는 매개 변수를 캡처합니다. 예를 들어, PhoneNumber 생성자는 finalLanguage이므로 numberLength 로컬 변수에 액세스 할 수 있습니다. numberLength는 캡처 된 변수입니다.

그러나, 자바 SE 8부터 로컬 클래스 로컬 변수 및 최종 또는 효과적으로 번복 둘러싸 블록의 파라미터에 액세스 할 수있다. 값이 초기화되지 않은 채로 변경된 인 변수 또는 매개 변수는 사실 최종 유효합니다.

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