请考虑以下代码:
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方法?
答案 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类的实现。独立性是否将此对象转换为父类型。