我们如何调用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
现在我的观点是,如果匿名类扩展了它的父类,它提供了引用,那么我们如何从匿名类调用父类的重写方法呢
# 1 楼答案
我猜你只是错过了一点。让我举个例子:
请注意,当您调用
obj.methodOfParentToBeOverriden()
时,它将从子类调用实现。您是否将此对象强制转换为父类型# 2 楼答案
调用父对象的重写方法和调用子对象的方法是有区别的。如果在类
T
中声明了一个方法,则可以对静态类型为T
的变量调用它,而不管该方法实际在何处实现在您的示例中,如果
obj.methodOfParent()
恰好是来自Child
的方法重写,那么Child
中的方法将运行,即使obj
的静态类型是Parent
匿名类也有同样的机制:允许调用
obj.m1()
的原因是m1()
已在父类中声明