假设我有以下类
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引用运行父方法?
答案 0 :(得分:2)
当您parent
child
方法时,由于override,child
对象将始终调用覆盖方法(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
决定它需要覆盖其中一个继承的方法,那么外部程序不应该试图破坏它。好像外部模块的作者在Parent
和Child
中深入研究了方法的实现,并决定“我想要父版本,而不是子版本”。但这并不是OOP的全部意义所在。外部程序的作者不应该关心如何实现该方法。请参阅Jon Skeet's answer here,我认为这解释了这一点以及我发现的任何内容。
如果您发现确实需要这样做,那么您就遇到了设计问题。解决方案将取决于您的特定项目(您的原始代码不是一个真实的例子,所以没有办法回答它)。但在某些情况下,解决方案可能是类需要提供两个不同的方法,这些方法具有相似但略有不同的目的。并且可能在您的类的某些子类中,这两个方法将具有完全相同的实现,但在其他子类中它们将是不同的。
答案 5 :(得分:0)
我认为你在这里混合了两个概念。 casting
和polymorphism
。阅读这些概念,然后事情会更清楚。