使用子类对象访问超类函数
我有一个子类的对象扩展其超类。 子类中有一个重写方法,可以使用该对象调用。 是否可以使用子类对象调用超类的函数?
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 } }