所以我明白,由于多态性,我们可以做: 超类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)。感谢您的帮助,如果它没有意义,我会澄清更多。
答案 0 :(得分:2)
它正在调用覆盖的方法,即方法覆盖是为了。
void doThat(Subclass Abc)
如果你在这里使用Subclass
,你只能将Subclass实例传递给它。相反,如果你有
void doThat(Superclass Abc)
然后你可以传递任何实现Superclass
的对象。这就是多态性的来源。 doThat
方法接受许多类型的对象,只要求它应该实现Superclass。
如果我进一步解释,
假设您有两个名为Subclass1
和Subclass2
的子类,这些是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
中的实现。