【问题标题】:How can we call methods overridden in a java anonymous class?我们如何调用在 java 匿名类中被覆盖的方法?
【发布时间】:2017-04-21 16:31:28
【问题描述】:

考虑下面的代码:

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

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

【问题讨论】:

  • 这很不清楚 - 你是在问为什么可以做到obj.m1()
  • 是的,@Oliver Charlesworth
  • 这是一个非常不清楚的问题。但需要指出的一件事是Parent obj = new Child(); obj.methodOfParent(); 将调用 Child 类的 methodOfParent(它要么继承自 Parent,要么覆盖并提供新的实现)。
  • On "如果对象有父类的引用,我们不能实现子类的方法" -- 你的意思是你不能调用 仅通过父类类型的变量在子类中的方法? [请注意,没有 Java 变量是对象——它们要么是原语,要么是对对象的引用。]
  • 如果您的问题是为什么不能从匿名类调用任何方法,而只能调用父/接口中定义的方法,那么答案是:因为您引用了该类型。在您的代码中,您有一个引用 Parent obj。因此,您只能通过此引用调用Parent 中定义的方法。这与抽象类无关,而与继承有关。

标签: java anonymous anonymous-class


【解决方案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() 时,它将被称为子类的实现。独立你是否将此对象强制转换为 Parent 类型。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多