我有一个父类,它有一个方法,在子类中,我有覆盖父类方法。在第三个类中,我创建一个子对象,并通过使用该对象,我想要父类的调用方法。是否可以调用该父类方法?如果是,那么如何?
请回复
答案 0 :(得分:16)
如果覆盖其子对象中的父方法,则子对象将始终使用被覆盖的版本。但;您可以使用关键字super
来调用父方法在子方法体内。
public class PolyTest{
public static void main(String args[]){
new Child().foo();
}
}
class Parent{
public void foo(){
System.out.println("I'm the parent.");
}
}
class Child extends Parent{
@Override
public void foo(){
//super.foo();
System.out.println("I'm the child.");
}
}
这将打印:
我是孩子。
取消注释注释行,它将打印:
我是父母。
我是孩子。
你应该寻找多态性的概念。
答案 1 :(得分:4)
在子类的重写方法中使用关键字 super 来使用父类方法。但是,您只能在重写方法中使用关键字。以下示例将有所帮助。
public class Parent {
public int add(int m, int n){
return m+n;
}
}
public class Child extends Parent{
public int add(int m,int n,int o){
return super.add(super.add(m, n),0);
}
}
public class SimpleInheritanceTest {
public static void main(String[] a){
Child child = new Child();
child.add(10, 11);
}
}
Child类中的add
方法调用super.add
以重用添加逻辑。
答案 2 :(得分:1)
首先,这是一个糟糕的设计,如果你需要这样的东西,重构是个好主意,例如通过重命名方法。 Java allows calling of overriden method using the "super" keyword,但层次结构只有一级,我不确定,Scala和其他一些JVM语言可能支持任何级别。
答案 3 :(得分:0)
假设层次结构为C->B->A
,其中A为基类。
我认为除了重命名方法之外,还有更多要解决此问题。这将工作,但这是一个修复?
一种方法是将B和C共有的所有功能重构为D,让B和C继承自D:(B,C)->D->A
现在B中隐藏A的实现的方法特定于B和呆在那儿。这允许C在没有任何基础的情况下调用A中的方法。
答案 4 :(得分:0)
注意通过super调用父方法仅适用于父类,
如果您的父级是接口,并且想调用默认方法,则需要在super之前添加interfaceName,例如IfscName.super.method();
interface Vehicle {
//Non abstract method
public default void printVehicleTypeName() { //default keyword can be used only in interface.
System.out.println("Vehicle");
}
}
class FordFigo extends FordImpl implements Vehicle, Ford {
@Override
public void printVehicleTypeName() {
System.out.println("Figo");
Vehicle.super.printVehicleTypeName();
}
}
需要接口名称,因为在此类扩展的多个接口名称中可以使用相同的默认方法。因此,需要显式调用方法。