好程式設計師Java實用教程系列之物件的轉型
好程式設計師Java今日分享實用的Java教程之物件的轉型
體現:
- 父類的引用可以指向子類的物件
- 介面的引用可以指向實現類的物件
轉型:
- 向上轉型
- 由子類型別轉型為父類型別,或者由實現類型別轉型為介面型別
- 向上轉型一定會成功,是一個隱式轉換
- 向上轉型後的物件,將只能訪問父類或者介面中的成員
- 向下轉型
- 由父類型別轉型為子類型別,或者由介面型別轉型為實現類型別
- 向下轉型可能會失敗,是一個顯式轉換
- 向下轉型後的物件,將可以訪問子類或者實現類中特有的成員
instanceof關鍵字
針對於向下轉型的。
如果向下轉型不成功,會怎樣?
- 會有一個異常 ClassCastException
如何避免這種情況?
在向下轉型之前,我們先判斷一下這個物件是不是要轉型的型別
怎麼判斷?
關鍵字 instanceof
Animal animal = new Dog();if (animal instanceof Dog) { // 說明animal的確是一個Dog}
如果一個類中重寫了父類的某一個方法。此時:
- 如果用這個類的物件來呼叫這個方法,最終執行的是子類的實現。
- 如果用向上轉型後的物件來呼叫這個方法,執行的依然是子類的實現。
- 因為向上轉型後的物件,歸根到底還是子類物件。
抽象類與抽象方法
抽象: abstract
抽象類:
用關鍵字abstract修飾的類,就是抽象類
抽象方法:
用關鍵字abstract修飾的方法,就是抽象方法
特點:
抽象方法:
抽象方法使用abstract來修飾,只有宣告,沒有實現。
public abstract void bark();抽象方法,只能夠寫在抽象類中。
抽象類:
- 抽象類使用abstract來修飾,抽象類不能例項化物件。
- 抽象類中是可以寫非靜態的成員的,這時候這些非靜態成員是可以繼承給子類的。
- 抽象類中是可以包含構造方法的。
結合抽象類和抽象方法:
- 非抽象子類在繼承一個抽象父類的同時,要實現父類中所有的抽象方法。
注意事項:
final關鍵字
- 抽象類可以用final來修飾嗎?
- 不能!因為final表示這個類無法被繼承。但是對於抽象類來說,如果無法被繼承,則這個抽象類沒有任何意義。
- 抽象方法可以用final修飾嗎?
- 不能!因為final修飾的方法無法被重寫。但是抽象方法又只能寫在抽象類中。如果一個抽象方法用final來修飾了,此時這個方法將無法被非抽象子類重寫,那這個子類就會有問題。
抽象類和抽象方法的實用場景:
可以用抽象類和抽象方法來實現一些簡單規則的制定。
例如:所有的快遞公司都必須要會xxxxx。KFC、麥當勞、
如果僅僅用抽象類和抽象方法來進行規則指定、行為約束:
弊端:因為Java是單繼承的語言,如果一個類為了遵循某一種規範,而去繼承一個抽象類,此時這個類將無法再繼承其他類。
為了解決這樣的問題,我麼可以使用介面進行行為約束,規範程式碼。
介面
關鍵字: interface
語法:
和類是比較像的,但是他不是類
[訪問許可權修飾符] interface 介面名字 { // 介面中的成員}
- 訪問許可權修飾符:和類一樣,只能有 public 和預設的default許可權。
- 介面不是類,不能例項化物件。
- 介面,暫時和類寫成平級的關係。
- 介面名字是一個識別符號,遵循大駝峰命名法
介面中成員的定義:
- 屬性:介面中的屬性,預設的修飾符是 public static final
- 構造方法:介面中不能寫構造方法
- 方法:
- 介面中的方法都是抽象方法
- 介面中的方法訪問許可權修飾符都是public
介面是需要被類來實現的。
實現介面關鍵字: implements
讓類實現介面:
public class Shunfeng extends Company implements Express { }
一個非抽象類在實現介面後,需要實現介面中所有的抽象方法。
一個類在繼承自一個父類後,還可以再去實現介面。
- 如果同時有父類和介面,那麼繼承父類在前,實現介面在後
一個類可以實現多個介面
- 如果一個類實現的多個介面中有相同的方法,這個方法在實現類中只需要實現一次即可。
介面之間是有繼承關係的,而且介面之間的繼承是多繼承。
public interface GrilFriend extends HouseKeeping, Takecare { }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2668084/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java教程系列之異常定義程式設計師Java
- 好程式設計師Java教程分享Java難點解析之泛型程式設計師Java泛型
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 好程式設計師web前端教程JavaScript系列之HTTP程式設計師Web前端JavaScriptHTTP
- 好程式設計師Java教程分享Java物件導向與程式導向程式設計師Java物件
- 好程式設計師大資料教程Scala系列之類程式設計師大資料
- 好程式設計師Java教程分享Java的兩種跳轉語句程式設計師Java
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師前端教程-javascript的物件導向程式設計師前端JavaScript物件
- 好程式設計師大資料教程Scala系列之方法的巢狀和方法多型程式設計師大資料巢狀多型
- 好程式設計師Java教程分享Vue外掛之Axios程式設計師JavaVueiOS
- 好程式設計師大資料教程Scala系列之繼承程式設計師大資料繼承
- 好程式設計師Java教程分享Java語法程式設計師Java
- 好程式設計師Java教程分享Java中String型別的10個問題程式設計師Java型別
- 好程式設計師Java教程分享List介面程式設計師Java
- 好程式設計師Java教程分享javaweb框架程式設計師JavaWeb框架
- 好程式設計師教程分享Java註解和運用註解程式設計程式設計師Java
- 好程式設計師大資料教程分享Scala系列之閉包程式設計師大資料
- 好程式設計師Java教程分享Java之包裝類與常用類程式設計師Java
- 好程式設計師Python教程系列分享之Python語言元素之運算子程式設計師Python
- 好程式設計師Python教程系列分享之Python語言元素之變數程式設計師Python變數
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java教程分享Java開發工具程式設計師Java
- 好程式設計師大資料教程分享實用的大資料之陣列程式設計師大資料陣列
- 好程式設計師Java教程分享Java中this的幾種用法程式設計師Java
- 好程式設計師Java教程分享幾個流行的Java框架程式設計師Java框架
- 好程式設計師大資料學習路線分享Scala系列之物件程式設計師大資料物件
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師Java教程分享Java實習生面試題集錦程式設計師Java面試題
- 好程式設計師大資料教程Scala系列之隱式轉換和隱式引數程式設計師大資料
- 好程式設計師分享JavaScript之-文件物件模型(DOM)程式設計師JavaScript物件模型
- 好程式設計師Java教程分享Java8.0新特性之Lambda表示式程式設計師Java
- 好程式設計師Java學習路線之Java中的物件流和序列化程式設計師Java物件
- 好程式設計師Java教程分享Java開發主流框架程式設計師Java框架
- 好程式設計師Java教程分享Java 迴圈結構程式設計師Java
- 好程式設計師Java教程分享Java設計模式的6大原則程式設計師Java設計模式
- 好程式設計師Java教程分享Java的4大核心基礎程式設計師Java
- 好程式設計師Java教程分享Java的五大特點程式設計師Java