【问题标题】:Polymorphism and Parameters?多态性和参数?
【发布时间】:2015-03-09 12:17:48
【问题描述】:
所以我知道由于多态性,允许这样做:
超类 Apt = new Subclass();
但我想知道以下情况:
Superclass Abc = new Subclass();
do(Abc);
void doThat(Superclass Abc)
Abc.Ball();
所以在doThat方法内部的Abc.method调用中,这是调用超类的Ball方法还是调用子类的Ball方法(假设子类已经重写了Ball方法)。如果它确实调用了子类的重写 Ball 方法,为什么我们不能将方法 doThat 设为:void doThat(Subclass Abc) 。感谢您的帮助,如果没有意义,我会澄清更多。
【问题讨论】:
标签:
java
inheritance
polymorphism
【解决方案1】:
它正在调用被覆盖的方法,该方法是覆盖的。
void doThat(Subclass Abc)
如果你在这里使用Subclass,你只能将子类实例传递给它。相反,如果你有
void doThat(Superclass Abc)
然后您可以传递任何实现Superclass 的对象,这就是多态性的来源。 doThat 方法接受多种类型的对象,唯一的要求是它应该实现超类。
如果我进一步解释,
假设您有两个名为 Subclass1 和 Subclass2 的子类,它们是超类的实现,其中超类是一个接口。 (这些子类应该实现超类方法定义,因此两个子类都有ball方法)
然后无论实例到达doThat 方法,它都会调用相应对象的ball 方法。作为void doThat(Superclass Abc) 接受超类类型。
【解决方案2】:
这是调用超类的 Ball 方法还是调用子类的 Ball 方法
调用Abc.Ball()会调用子类中被覆盖的方法。
如果它确实调用了子类的重写 Ball 方法,为什么我们不能将方法 doThat 改为: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】:
如果Ball方法是静态的,它会调用超类,因为Ball方法是在类级别定义的,如果它是在对象级别定义的,那么它肯定会在子类上调用覆盖的方法。
【解决方案4】:
在你描述的情况下,调用
Abc.Ball();
将调用Subclass中的实现。