为了账号安全,请及时绑定邮箱和手机立即绑定

Java - 当继承,多态性,重载和重写都涉及时调用哪个函数?

Java - 当继承,多态性,重载和重写都涉及时调用哪个函数?

九州编程 2022-08-17 16:49:05
我有这个问题涉及继承,多态性,重载和覆盖。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下:class A {    public String show(D obj) {return "A and D";}    public String show(A obj) {return "A and A";}}class B extends A {    public String show(B obj) {return "B and B";}    public String show(A obj) {return "B and A";}}class C extends B{}class D extends B{}public class whatever {    public static void main(String[] args) {        A a = new B(); // note the B here        B b = new B();        C c = new C();        D d = new D();        System.out.println(a.show(a)); // B and A        System.out.println(a.show(b)); // B and A        System.out.println(a.show(c)); // B and A        System.out.println(a.show(d)); // A and D    }}所以这里的任务是找到输出。我已经有了答案,这些是我提出的评论。我理解第一个,因为Java会自动进行动态绑定,所以a.show()从B类调用show(),a是A类型,所以B.show(A obj)被调用。最后一个也有意义,show()方法是重载的,并且由于d是D类型,因此调用A.show(D obj)是从A类继承而来的。另外两个我遇到了麻烦。好吧,我知道这是有道理的,因为b和c在技术上都是A类型的对象,但是为什么它与“B和A”而不是“B和B”一起使用?
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

的声明类型为 。aA

A只有两种方法:一个取A(b和c都是A的实例),另一个取D(b和c都不是D的实例)。

因此,第一种方法匹配,第二种方法不匹配。因此,编译器选择了第一种方法。

此方法在 B 中被覆盖,并且的具体类型是 B,因此打印了“B 和 A”。a

该方法不会覆盖该方法,因为它不采用与参数相同的类型。B.show(B)A.show(A)


查看完整回答
反对 回复 2022-08-17
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

这里有两个概念,一个是重载,另一个是重写。当您创建 A a = new B() 时;它意味着 a 是 B 的对象,并且具有 A 的类型。因此,当执行a.show(a)时,它首先遇到类A的show(A obj)和show(B obj)方法,然后将参数与A类型匹配,但'a'是B的实例,因此执行B类的方法show(A obj)。

现在,当执行 a.show(c) 时,它首先遇到类 A 的 show(A obj) 和 show(B obj) 方法,然后找不到与类 A 中的 C 类型参数的任何匹配项,但它仍然被执行,因为类 C 扩展 B,B 扩展 A。

简而言之,我们可以说a.show(a)等价于a.show(b),等价于a.show(c)。


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信