2010-12-13 2 views
0

익명 내부 클래스를 사용하면 Java가 익명 내부 클래스 블록 외부에서 선언 된 필드를 어떻게 처리합니다.익명 내부 클래스 및 해당 코드 블록 외부의 필드

policyOwnerModelObject의 경우 생성 된 익명의 내부 클래스에서 해당 필드를 어떻게 정의합니까?

// Local variable 
final Bean policyOwnerModelObject = XXXXX <--- here, how is the class built with access to this object. Is it a final field in the class? 

    final WebMarkupContainer container = new WebMarkupContainer("container") {    
      @Override 
      public boolean isVisible() {     
       if ((policyOwnerModelObject.getPolicyOwner() != null) && (policyOwnerModelObject.getPolicyOwner().getValue() != null)) { 
        return !PolicyOwnerService.TRUST.equals(policyOwnerModelObject.getPolicyOwner().getValue()); 
       } else { 
        return false; 
       } 
      } 
     }; 

====

확인, 클래스를 디 컴파일 그리고 이것은 내가 가진 것입니다 : 여기

class MyDataPanel$1 extends WebMarkupContainer 
{ 

    public boolean isVisible() 
    { 
     if(val$policyOwnerModelObject.getMy() != null && val$policyOwnerModelObject.getMy().getValue() != null) 
      return !"4".equals(val$policyOwnerModelObject.getMy().getValue()); 
     else 
      return false; 
    } 

    final MyDataPanel this$0; 
    private final MyBean val$policyOwnerModelObject; 

    MyDataPanel$1(MyBean policyownerbean) 
    { 
     this$0 = final_policytrustpanel; 
     val$policyOwnerModelObject = policyownerbean; 
     super(String.this); 
    } 
} 
+0

나는이 줄을 이해하지 못한다 :'this $ 0 = final_policytrustpanel;'final_policytrustpanel은 어디에서 왔는가? – jjnguy

+0

바깥 쪽 'this'는 (내부 클래스가 익명이 아닌 경우에도) 둘러싼 메소드의 'final'로컬이라고 생각하십시오. –

+0

ABC $ 1.class 파일을 디 컴파일했습니다. 디 컴파일러는 final_policy 트러스트를 선택하지 않았습니다. 나는 그것이 무엇인지 모른다. 그러나 나는 나의 대답을 얻었다. –

답변

1

private Bean policyOwnerModelObject 클래스의 단지 일반 회원입니다. 변수는 익명 클래스가되기 전에 범위를 벗어나지 않으므로이 경우 최종 변수 일 필요는 없습니다. 내부 클래스는 내부 클래스의 멤버 인 것처럼 변수에 대한 모든 액세스 권한을 갖습니다.

일반적으로 익명 또는 아닌 내부 클래스는 부모 클래스의 멤버 변수에 대한 모든 액세스 권한을 갖습니다.

+0

위의 내용을 참조하여 익명의 내부 클래스를 역 컴파일했습니다. 흥미 롭 군. –

관련 문제