您的位置:首页 > 编程语言 > Java开发

Java 多态笔记详解

2016-07-21 12:13 417 查看
 记得大学中也经常提到多态,不过当时并不觉得有什么稀奇,也没多少好奇心。今天无意看了一篇关于Java
多态的文章,发现给了例子之后,有很多我们初学者觉得疑惑的地方(结果出乎我们意料),博主并没有很多的解释,所以决定续写下来吧。子:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html 

(一,相关类)
    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

--------------------------------------

对于引用 a1 中打印出的结果,并不足为奇,但 a2 打印的结果(4,5,6)往往令很多人感到迷惑(一开始我也是),原因是在这种情况下我们很容易理解为Class B 中的 的   public String show(B obj) 覆盖类 A中的方法,其实只是重载了一下show()方法而已。而且 a1 所持的对象,对  public String show(B obj)  这个方法是不可见的,因为 a1 句柄是Class A , 而A中并没有此方法(所以 4 中调用的方法是 public String show(A obj),而不是public String show(B obj))。结果6 也是同理,另外对于第6,为什么会调用public String show(D obj) 而不是调用 public String show(A obj) 呢?下面会给出。

其实出现这样的混淆的原因,主要是因为:

1. 我们容易混淆 这两个类中,到底哪个是重载,哪个是覆盖: 其实覆盖的条件是:(1)方法名相同,(2)定义的参数相同,不仅个数相同,而且类型也需要完全相同。

2. 在对象  b 中, 因为句柄是 Class B , 所以B 中的方法对于 b 是完全可见的, 但 我们传入 了 C 的对象和 D 的对象,那么这种情况下, 对象 c,d 在Class B 中的两个 b.show() 中,到底算 Class A 的类型 还是 Class B 的类型呢? 在这里,我的理解是从具体类型开始查找,然后一步一步逐步到父类,最后到 Object类(Object是所有Java Class 的父类)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: