Java 重写方法,为什么可以';我不能参考自己的新方法吗?

Java 重写方法,为什么可以';我不能参考自己的新方法吗?,java,inner-classes,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 n

我不明白这一点:

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()方法,而在第二种情况下我可以调用它?

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

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

您不能在
listener
上调用
hello
,因为
listener
的编译时类型是
OnGlobalLayoutListener
,它没有
hello
方法

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

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

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

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

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

您不能在
listener
上调用
hello
,因为
listener
的编译时类型是
OnGlobalLayoutListener
,它没有
hello
方法

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

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

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

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

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


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

在这两种情况下,您都可以通过创建

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

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

与中的相同问题相同