2010-12-13 34 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 2010-12-13 17:03:33

+0

将外部'this'看作封闭方法的'final'局部(即使内部类不是匿名的)。 – 2010-12-13 17:05:31

+0

我反编ABC $ 1.class文件。反编译器没有拿起final_policy信任。我不知道那是什么。但是,我得到了我的答案。 – 2010-12-13 17:18:36

回答

1

这里private Bean policyOwnerModelObject是类的只是一个普通的成员。在这种情况下,变量不一定是最终的,因为它在匿名类之前永远不会超出范围。内部类将具有对该变量的完全访问权限,就好像它是该内部类的成员一样。

一般而言(匿名与否)内部类可以完全访问其父类的成员变量。

+0

见上面,我反编译匿名内部类。有趣。 – 2010-12-13 16:56:42