从java中的子类对象调用父类方法

时间:2010-09-26 09:28:15

标签: java

我有一个父类,它有一个方法,在子类中,我有覆盖父类方法。在第三个类中,我创建一个子对象,并通过使用该对象,我想要父类的调用方法。是否可以调用该父类方法?如果是,那么如何?

请回复

5 个答案:

答案 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();
    }
}

需要接口名称,因为在此类扩展的多个接口名称中可以使用相同的默认方法。因此,需要显式调用方法。