当前位置: 首页 > 知识库问答 >
问题:

重写方法,为什么我不能引用新的方法?

董琦
2023-03-14

我不明白这一点:

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个答案

杨和蔼
2023-03-14

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

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

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

连志义
2023-03-14

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

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

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

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

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

new Object {
    public void hello() { ... }
}
 类似资料:
  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?

  • 当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

  • 问题内容: 我目前正在从Java教程oracle学习Java类和对象,并且遇到了以下语句和代码。我理解这个概念,但是不知道为什么我们不能覆盖一个方法并定义它以返回原始方法的超类?背后的原因是什么?有人可以启发我吗?在此先感谢您的帮助! 您可以重写方法并定义它以返回原始方法的子类,如下所示: 覆盖原始方法: 问题答案: 想象一下是否有可能: 瞧,这只是合同问题。当您去咖啡店时,您期望它可以出售咖啡。

  • 本文向大家介绍为什么在重写 equals方法的同时必须重写 hashcode方法,包括了为什么在重写 equals方法的同时必须重写 hashcode方法的使用技巧和注意事项,需要的朋友参考一下 我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。 其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。O

  • 这是另一个非常经典的 java 多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来! new 一个 Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 r