我有这个问题涉及继承,多态性,重载和覆盖。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下: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个赞
的声明类型为 。a
A
A只有两种方法:一个取A(b和c都是A的实例),另一个取D(b和c都不是D的实例)。
因此,第一种方法匹配,第二种方法不匹配。因此,编译器选择了第一种方法。
此方法在 B 中被覆盖,并且的具体类型是 B,因此打印了“B 和 A”。a
该方法不会覆盖该方法,因为它不采用与参数相同的类型。B.show(B)
A.show(A)
慕姐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)。
添加回答
举报
0/150
提交
取消