我们如何调用在java匿名类中重写的方法?

时间:2017-04-21 16:31:29

标签: java anonymous 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();
  }
}

现在这是我对这段代码不了解的内容 我读到匿名类创建了一个名称未知的类,它扩展了提供引用的类(这里是抽象的AbstractClass)。

另外我记得如果对象引用了父类,我们就无法实现子类的方法。

见下面的代码块

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

现在我的观点是,如果 Anonymous Class 扩展了其提供引用的 Parent Class ,那么我们如何从Anonymous Class调用Parent Class的overriden方法?

2 个答案:

答案 0 :(得分:2)

调用父类的重写方法和调用子方法之间存在差异。如果在类T中声明了一个方法,则可以在静态类型为T的变量上调用它,无论该方法在何处实际实现。

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

与匿名类相同的机制:允许您调用Parent的原因是obj.m1()已在父类中声明。

答案 1 :(得分:1)

我想你只是错过了一点。让我举个例子:

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()时,它将被称为Child类的实现。独立性是否将此对象转换为父类型。