Java中多态(向上转型)机制
生活随笔
收集整理的這篇文章主要介紹了
Java中多态(向上转型)机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.為什么向上轉型?
所謂多態,也即向上轉型,就是某個對象的引用視為對其基類的引用,編譯對象是基類,運行對象是父類。向上轉型的對象由于Java后期綁定的特點,若父類重寫了基類中的方法,則它調用的是父類中的方法,其余調用的是基類中的方法。通過多態,我們可以減少代碼的冗余,當多個類繼承某個基類時,我們希望引用對象調用他們自身的方法,這時只需要寫出一條基類的對象引用即可。
2.代碼實現
class A{void a(){System.out.println("A:a()");b();};void b(){System.out.println("A:b()");} } public class Oos extends A{void b(){System.out.println("B:b()");}public static void main(String args[]){A test=new Oos();test.a();} }這個例子中,test即為向上轉型的對象,它調用a()方法時,因為子類中沒有a()方法,所以調用的是父類的a()方法,在父類a()方法中,又調用了本身的b()方法,而它在子類Oos中有重寫過,因此調用的是子類中的b()方法。輸出如下所示:
?
3.缺陷
(1)只有非private方法才能覆蓋,因為private默認為final類型,當父類中的方法為private時,子類中的非private同名方法視為全新的方法,后期不會綁定它父類中的方法。代碼如下;
class A{void a(){System.out.println("A:a()");b();}private void b(){System.out.println("A:b()");} }public class Oos extends A{public void b(){System.out.println("B:b()");}public static void main(String args[]){A test=new Oos();test.a();} }結果為:
(2)對于基類和父類的數據成員,向上轉型對象不會覆蓋數據成員,代碼如下:
class A{int i=0;void a(){System.out.println("A:a() i="+i);b();};void b(){System.out.println("A:b()");} }public class Oos extends A{int i=1;void b(){System.out.println("B:b() i="+i);}public static void main(String args[]){A test=new Oos();test.a();} }結果為:
可以看到B中覆蓋的方法中i的值還是自己類中的值,不會覆蓋數據成員。
(3)靜態方法方法不具有多態性,因為靜態方法在編譯前就已被初始化,不具有后期綁定的特點。代碼省略。
總結
以上是生活随笔為你收集整理的Java中多态(向上转型)机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode上求两个排序数组中位数问
- 下一篇: Java中抽象类和接口的使用方法及区别