我有一个子类的对象扩展其超类。子类中有一个重写的方法,可以使用该对象调用。 是否可以使用子类对象调用超类的函数?
package supercall;
public class Main {
public static void main(String[] args) {
SomeClass obj = new SubClass();
obj.go(); //is there anything like, obj.super.go()?
}
}
class SomeClass {
SomeClass() {
}
public void go() {
System.out.println("Someclass go");
}
}
class SubClass extends SomeClass {
SubClass() {
}
@Override
public void go() {
System.out.println("Subclass go");
}
}
考虑上面的代码。
这里打印
子类去
。相反,我必须打印
超级课程
答案 0 :(得分:15)
不,这是不可能的,如果你认为你需要它,重新考虑你的设计。覆盖方法的重点是替换其功能。如果一个不同的类对该类的内部工作了解得太多,那么你就完全杀死了封装。
答案 1 :(得分:3)
在这里打印 子类去 。相反,我必须打印 超类去
好吧,那么不要覆盖go方法@ subclass,它会调用超类实现。
如果你想运行超级实现,并且有一些其他代码@ subclass,你可以调用super.go();然后运行一些其他语句。
没关系,因为你正在重用已编写的代码,你不应该从超类复制粘贴代码并将其放入子代码中,因为它是代码重复。但如果你的目标是完全改变行为,那就不要打电话给超级
答案 2 :(得分:2)
而不是:
System.out.println("Subclass go");
写
super.go();
(或者,你知道,只是不要实现那种方法......)。
答案 3 :(得分:0)
有没有办法实现这个目标?不,没有。
在运行时,JVM将根据实例类型(这是您的多态性)选择要调用的方法,而不是基于它声明的类型。
您的实例是子类实例,因此将调用子类中的go()方法。
答案 4 :(得分:0)
一种方法是让子类调用超类实现。但我假设那不是你想要的?
class SubClass extends SomeClass {
SubClass() {}
@Override
public void go() {
super.go
}
}