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

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

4

2 回答 2

3

您正在创建一个新的匿名类型,其中包含一个名为 的新方法hello

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

无法调用hellolistener因为listeneris的编译时类型OnGlobalLayoutListener没有hello方法。

如果您想添加额外的方法,我个人建议您在当前类中创建一个新的嵌套类。你可以在一个方法中声明一个新的命名类,但我不建议这样做,就它造成的混乱而言。

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

new Object {
    public void hello() { ... }
}
于 2012-08-11T12:00:54.077 回答
1

在这两种情况下,您都通过创建匿名内部类来实例化一个对象,但是您引用该hello()方法的方式不同:

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

在第二种情况下,该hello()方法是可访问的,因为您在引用刚刚实例化的类时调用它。与接口相比,该类有两个方法,覆盖方法onGlobalLayout()和请求hello()方法。

于 2012-08-11T12:14:19.860 回答