lauray_
一介刁民
2016-01-21 06:50
采纳率: 0%
浏览 1.4k

求解释多态原理,下面的问题和答案已经把我弄懵了,求大神帮忙

(一)相关类

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...{}


(二)问题:以下输出结果是什么?

A a1 = new A();

A a2 = new B();

B b = new B();

C c = new C();

D d = new D();

System.out.println(a1.show(b)); ①

System.out.println(a1.show(c)); ②

System.out.println(a1.show(d)); ③

System.out.println(a2.show(b)); ④

System.out.println(a2.show(c)); ⑤

System.out.println(a2.show(d)); ⑥

System.out.println(b.show(b)); ⑦

System.out.println(b.show(c)); ⑧

System.out.println(b.show(d)); ⑨


(三)答案

① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • danielinbiti
    danielinbiti 2016-01-21 07:20
    点赞 评论
  • enpterexpress
    把分全给哥 2016-01-21 07:26
    点赞 评论
  • Mr_dsw
    Antway_ 2016-01-21 07:36

    多态是面向对象的一个特性。。。

    点赞 评论
  • caozhy

    首先,帮你验证了下
    http://ideone.com/u5vIlt
    这里的答案是对的。

    其次,不要为了这个问题纠结。这个程序不但有方法重写,还有类型重载。即便是非常有经验的程序员,在阅读这种代码的时候也经常搞不清楚——这种代码根本就不应该搞清楚。

    点赞 评论
  • fvxiaoyi
    fvxiaoyi 2016-01-21 08:47

    我猜你有疑惑的应该是5,8
    5. A a2 = new B(); B继承A, 声明一个A类型的引用a2 指向一个B类型的实例,这个时候B的实例只能当成A来用,A里面只有show(A a)和show(D d)
    而show(A a)被 子类B重写,实际调用的是B的show(A a),a2.show(c) 传入参数是一个C类型的,所以只能调用show(A a)
    8. B类型有show(A a)和show(B b) ,b.show(c),根据重载的最近匹配原则,c向上转型一次匹配到B ,所以会调用show(B b)方法

    点赞 评论
  • wojiushiwo945you
    毕小宝 2016-01-21 09:38
     你的代码代码涉及两个概念,同一个类中方法名称相同但参数类型不同,这是方法重载;类子类有与父类相同的方法声明但实现不同,这个是重写。多态是建立在重写基础上的,最终调用的方法由真正的类型决定。
    
    点赞 评论

相关推荐