有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

考虑下面的代码:

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

下面是我不理解的代码
我读到匿名类创建了一个名称未知的类,它扩展了提供引用的类(这里是抽象类)

我还记得,如果对象具有父类的引用,则无法实现子类的方法

请参阅下面的代码块

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

现在我的观点是,如果匿名类扩展了它的父类,它提供了引用,那么我们如何从匿名类调用父类的重写方法呢


共 (2) 个答案

  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()时,它将从子类调用实现。您是否将此对象强制转换为父类型

  2. # 2 楼答案

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

    在您的示例中,如果obj.methodOfParent()恰好是来自Child的方法重写,那么Child中的方法将运行,即使obj的静态类型是Parent

    匿名类也有同样的机制:允许调用obj.m1()的原因是m1()已在父类中声明