2012-08-11 57 views
1

我不明白这一点:覆盖方法,为什么我不能参考新的自己的方法?

OnGlobalLayoutListener listener = new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     System.out.println("I am override a method"); 
    } 

    public void hello(){ 
     System.out.println("This is a new method"); 
    } 
}; 

//listener.hello(); Why I cannot do it? 

没有这个我能做到这一点:

new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      System.out.println("I am override a method"); 
     } 

     public void hello(){ 
      System.out.println("This is a new method"); 
     } 
    }.hello(); 

为什么在第一种情况下我不能调用方法你好()和第二种情况下我可以做它?

+0

相同的问题 http://stackoverflow.com/questions/10800678/can-i-access-new-methods-in-anonymous-inner-class-with-some-syntax – Lesiak 2012-08-11 12:12:35

回答

3

您正在创建一个新的匿名类型,并使用一种名为hello的新方法。

您可以表达new OnGlobalLayoutListener() { }调用hello因为表达的类型是新的匿名类型。

可以listener通话hello因为listener的编译时类型为OnGlobalLayoutListener,其中没有一个hello方法。

如果你想添加额外的方法,我个人建议你在你的当前类中创建一个新的嵌套类。你可以在一个方法中声明一个新的命名类,但我不会建议它,只是在它创建的混乱方面。

请注意,重写onGlobalLayout与问题完全无关。你会看到同样的事情,如果你试着写:

new Object { 
    public void hello() { ... } 
} 
1

在这两种情况下,通过创建一个anonymous inner class实例化一个对象,但你引用的方式hello()方法不同:

在第一种情况下, ,您将实例化的类分配给OnGlobalLayoutListener接口的引用。问题在于界面没有声明hello()方法,所以无法调用。但是,如果您尝试拨打onGlobalLayout(),则没有问题。

在第二种情况下,hello()方法是可访问的,因为您将其称为参考刚刚实例化。与接口相反,该类有两种方法,即覆盖onGlobalLayout()和请求的hello()方法。