使用子类对象访问超类函数

我有一个子类的对象扩展其超类。 子类中有一个重写方法,可以使用该对象调用。 是否可以使用子类对象调用超类的函数?

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

考虑上面的代码。

在这里打印

子类去

。 相反,我必须打印

超级去

不,这是不可能的,如果你认为你需要它,重新考虑你的设计。 覆盖方法的重点是替换其function。 如果一个不同的类对该类的内部工作了解得太多,那么你就完全杀死了封装。

在这里打印Subclass go。 相反,我必须打印Superclass go

好吧,那么不要重写go方法@ subclass,它会调用超类实现。

如果你想运行超级实现,并有一些其他代码@ subclass,你可以调用super.go(); 然后运行一些其他语句。

没关系,因为你正在重用已编写的代码,你不应该从超类复制粘贴代码并将其放入子代码中,因为它是代码重复。 但如果你的目标是完全改变行为,那就不要打电话给超级

代替:

 System.out.println("Subclass go"); 

 super.go(); 

(或者,你知道,只是不要实现那种方法……)。

有没有办法实现这个目标? 不,没有。

在运行时,JVM将根据实例类型(这是您的多态性)选择要调用的方法,而不是基于它声明的类型。

您的实例是子类实例,因此将调用子类中的go()方法。

一种方法是使子类调用超类实现。 但我假设那不是你想要的?

 class SubClass extends SomeClass { SubClass() {} @Override public void go() { super.go } }