覆盖方法,为什么我不能引用新的自己的方法?

时间:2012-08-11 11:56:01

标签: java inner-classes

我不明白这一点:

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();

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

2 个答案:

答案 0 :(得分:3)

您正在使用名为hello的新方法创建新的匿名类型。

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

无法hello上致电listener,因为listener的编译时类型为OnGlobalLayoutListener,但没有hello onGlobalLayout方法。

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

请注意,覆盖new Object { public void hello() { ... } } 与问题完全无关。如果你尝试写作,你会看到同样的事情:

{{1}}

答案 1 :(得分:1)

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

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

在第二种情况下,可以访问hello()方法,因为您在刚刚实例化的的引用上调用它。与界面相反,该类有两种方法,覆盖onGlobalLayout()和请求的hello()方法。