我该如何运行父方法?

时间:2014-04-22 20:03:33

标签: java polymorphism

假设我有以下类

  Class Parent{
    public void test(){
        System.out.println("Parent");
    }
  }

  Class Child extends Parent{
    public void test(){
        System.out.println("Child");
    }
  }

Parent parentE = new Child();
parentE.test();
((Parent)parentE).test();

输出是:

Child
Child

但是如何在这种情况下使用parentE引用运行父方法?

6 个答案:

答案 0 :(得分:2)

当您parent child方法时,由于overridechild对象将始终调用覆盖方法(parent方法)。

因此,在您的情况下,您可以在child对象中明确调用Class Child extends Parent{ public void test(){ super.test(); } } 方法:

Parent parentE = new Parent();
parentE.test();

或者创建一个Parent对象并调用它的方法。

{{1}}

答案 1 :(得分:1)

这是多态性的一个关键特征。

您实例化的对象是Child的实例。调用该对象的test() 总是会导致调用Child(被覆盖)test(),即使您和#39;已将该实例分配给Parent类型的变量。

简而言之,这就是如何实现更具体的行为,同时只需使用声明为超类类型的变量引用对象。通常,它与基类一起使用,仅为子类提供抽象方法以覆盖。

初学者书中的一个小例子通常涉及动物或汽车:

public abstract class Animal
{
    private final String name;

    public Animal(String name)
    {
        this.name = name;
    }

    public void printName()
    {
        System.out.println(name);
    }

    // more animal general stuff followed by:

    public abstract void makeSound();

}

public class Dog extends Animal
{
    public Dog()
    {
        super("Dog");
    }

    @Override
    public void makeSound()
    {
        System.out.println("Woof!");
    }
}

List<Animal> aList = new ArrayList<Animal>();
aList.add(new Dog());
aList.add(new Cat());
// etc
for (Animal a : aList) 
{
    a.printName();
    a.makeSound(); // calls each subclasses' "makeSound()"
}

除非您在{{1}中的方法中实例化Parent或致电test(),否则您无法致电Parent super.test() }}

(我其实在想我能找到一个很好的副本,提供了一个不错的答案,但我不能)

答案 2 :(得分:0)

简单

Parent parentE = new Parent();
 parentE.test();

答案 3 :(得分:0)

  

如果method overriding基于run-time而不是基于裁判数据类型在actual data type of object处解决了。{/ p>

你不能直接调用超级类的重写方法。

答案 4 :(得分:0)

基本上,不,你不能这样做,这将是一个坏主意。如果Child决定它需要覆盖其中一个继承的方法,那么外部程序不应该试图破坏它。好像外部模块的作者在ParentChild中深入研究了方法的实现,并决定“我想要父版本,而不是子版本”。但这并不是OOP的全部意义所在。外部程序的作者不应该关心如何实现该方法。请参阅Jon Skeet's answer here,我认为这解释了这一点以及我发现的任何内容。

如果您发现确实需要这样做,那么您就遇到了设计问题。解决方案将取决于您的特定项目(您的原始代码不是一个真实的例子,所以没有办法回答它)。但在某些情况下,解决方案可能是类需要提供两个不同的方法,这些方法具有相似但略有不同的目的。并且可能在您的类的某些子类中,这两个方法将具有完全相同的实现,但在其他子类中它们将是不同的。

答案 5 :(得分:0)

我认为你在这里混合了两个概念。 castingpolymorphism。阅读这些概念,然后事情会更清楚。