多态性和参数?

时间:2015-03-09 12:17:49

标签: java inheritance polymorphism

所以我明白,由于多态性,我们可以做: 超类Apt = new Subclass(); 但我想知道:

Superclass Abc = new Subclass(); 
do(Abc);
void doThat(Superclass Abc)
   Abc.Ball();

所以在方法doThat中的Abc.method调用中,这会调用Superclass的Ball方法还是调用Subclass的Ball方法(假设子类重写了Ball方法) )。如果它确实调用了子类的重写Ball方法,为什么我们不能让方法做到:void doThat(Subclass Abc)。感谢您的帮助,如果它没有意义,我会澄清更多。

4 个答案:

答案 0 :(得分:2)

它正在调用覆盖的方法,即方法覆盖是为了。

void doThat(Subclass Abc)

如果你在这里使用Subclass,你只能将Subclass实例传递给它。相反,如果你有

void doThat(Superclass Abc)

然后你可以传递任何实现Superclass的对象。这就是多态性的来源。 doThat方法接受许多类型的对象,只要求它应该实现Superclass。

如果我进一步解释, 假设您有两个名为Subclass1Subclass2的子类,这些是Superclass的实现,其中Superclass是一个接口。 (这些子类应该实现超类方法定义,因此两个子类都有ball方法)

然后无论实例进入doThat方法,它都会调用相应对象的ball方法。由于void doThat(Superclass Abc)接受超类类型。

答案 1 :(得分:1)

如果Ball方法是静态的,它将调用超类,因为Ball方法是在类级别定义的,而如果它是在对象级别定义的,那么它肯定会在子类上调用重写方法

答案 2 :(得分:1)

  

这会调用Superclass的Ball方法还是调用Subclass的Ball方法

调用Abc.Ball()将调用子类中的overriden方法。

  

如果它确实调用了Subclass的重写Ball方法,为什么我们不能让方法做到:void doThat(Subclass Abc)而不是

想象一下,您有两个Superclass的子类:

Superclass abc = new SubclassA();
Superclass xyz = new SubclassZ();

定义void doThat(Superclass abc)意味着方法doThat()将接受作为Superclass实例或其任何子类的任何对象。然后,您可以执行doThat(abc)doThat(xyz),并且两者都会在相应的实例中调用Ball()方法。

相反,如果您有doThat(SubclassA abc),则还需要Superclass的每个子类的特定方法,例如doThat(SubclassZ xyz)

答案 3 :(得分:0)

在您描述的情况下,通话

Abc.Ball();

将调用Subclass中的实现。