我们如何调用在 java 匿名 class 中覆盖的方法?

How can we call methods overridden in a java anonymous class?

考虑以下代码:

abstract class AbstractClass {
  abstract m1();
}

public class Test {
  public static void main(String [] args) {
    AbstractClass obj = new AbstractClass() {
      @Override void m1() { 
        System.out.print("Instance of abstract class !");
      }
    };
    obj.m1();
  }
}

下面是我对这段代码不理解的地方。
我读到匿名 class 创建了名称未知的 class,它扩展了提供引用的 class(这里是抽象的 AbstractClass)。

我还记得,如果对象引用了父对象 class,我们就不能实现子对象 class 的方法。

请参阅下面的代码块

Parent obj = new Child();
obj.methodOfParent();
obj.methodOfChild();  //this gives error

如果 Anonymous Class 扩展了它的 Parent Class 提供了引用,那么我的观点是,那么我们如何从 Anonymous Class?

调用 Parent Class 的覆盖方法

调用父类的重写方法和调用子类的方法是有区别的。如果方法在 class T 中声明,您可以在静态类型为 T 的变量上调用它,而不管该方法实际在何处实现。

在您的示例中,如果 obj.methodOfParent() 恰好是 Child 的方法覆盖,Child 中的方法将 运行,即使 obj的静态类型是 Parent.

相同的机制在匿名 classes 中发挥作用:允许您调用 obj.m1() 的原因是 m1() 已在父 class 中声明.

我猜你只漏掉了一点。让我举个例子:

class Parent {
  public void methodOfParent() {}
  public void methodOfParentToBeOverriden() {}
}
class Child extends Parent {
  @Override public void methodOfParentToBeOverriden() {}
  public void methodOfChild() {}
}

Parent obj = new Child();
obj.methodOfParent(); //this is OK
obj.methodOfParentToBeOverriden(); // this is OK too
obj.methodOfChild();  //this gives error  
((Child)obj).methodOfChild();  //this is OK too here.

请注意,当您调用 obj.methodOfParentToBeOverriden() 时,它将调用子 class 的实现。独立你是否将此对象转换为Parent类型。