2010-12-13 18 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; 
       } 
      } 
     }; 

====

OKは、クラスを逆コンパイルし、これは私が得たものである:ここでは

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

上記を参照して、匿名の内部クラスを逆コンパイルしました。面白い。 –

関連する問題