1.6 为什么使用向上转型而不直接创建子类对象?
生活随笔
收集整理的這篇文章主要介紹了
1.6 为什么使用向上转型而不直接创建子类对象?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
初學者在學習向上轉型可能會很難理解,向上轉型并不能調用子類特有屬性和方法,我們必須先生成子類實例再賦值給父類引用(向上轉型),然后將父類引用向下強制轉換給子類引用(向下轉型),這樣才能調用子類中的所有成員。這看起來像是多次一舉,還不如直接創建子類實例。
隨著技術的提升,我們在學習其它開源項目時會發現很多地方都用了向上轉型和向下轉型的技術。本節將帶大家了解向上轉型和向下轉型的意義及使用場景。
例 1
定義父類 Animal,代碼如下:
子類 Cat 代碼如下:
public class Cat extends Animal {@Overridepublic void sleep() {System.out.println("貓正在睡覺");} }子類 Dog 代碼如下:
public class Dog extends Animal {@Overridepublic void sleep() {System.out.println("狗正在睡覺");} }輸出結果為:
貓正在睡覺 狗正在睡覺如果不用向上轉型則必須寫兩個 doSleep 方法,一個傳遞 Cat 類對象,一個傳遞 Dog 類對象。這還是兩個子類,如果有多個子類就要寫很多相同的方法,造成重復。可以看出向上轉型更好的體現了類的多態性,增強了程序的間接性以及提高了代碼的可擴展性。當需要用到子類特有的方法時可以向下轉型,這也就是為什么要向下轉型。
比如設計一個父類 FileRead 用來讀取文件,ExcelRead 類和 WordRead 類繼承 FileRead 類。在使用程序的時候,往往事先不知道我們要讀入的是 Excel 還是 Word。所以我們向上轉型用父類去接收,然后在父類中實現自動綁定,這樣無論你傳進來的是 Excel 還是 Word 就都能夠完成文件讀取。
總結如下:
- 把子類對象直接賦給父類引用是向上轉型,向上轉型自動轉換。如 Father father = new Son();
- 指向子類對象的父類引用賦給子類引用是向下轉型,要強制轉換。使用向下轉型,必須先向上轉型,為了安全可以用 instanceof 運算符判斷。
如 father 是一個指向子類對象的父類引用,把 father 賦給子類引用 son,即 Son son
=(Son)father;。其中 father 前面的(Son)必須添加,進行強制轉換。 - 向上轉型不能使用子類特有的屬性和方法,只能引用父類的屬性和方法,但是子類重寫父類的方法是有效的。
- 向上轉型時會優先使用子類中重寫父類的方法,如例 1 中調用的 sleep 方法。
- 向上轉型的作用是減少重復代碼,可以將父類作為參數,這樣使代碼變得簡潔,也更好的體現了多態。
總結
以上是生活随笔為你收集整理的1.6 为什么使用向上转型而不直接创建子类对象?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.5 对象类型转换:向上转型和向下转型
- 下一篇: 1.7 方法重载