好程序員Java今日分享實用的Java教程之對象的轉型java
體現:程序員
- 父類的引用能夠指向子類的對象
- 接口的引用能夠指向實現類的對象
轉型:code
向上轉型對象
- 由子類類型轉型爲父類類型,或者由實現類類型轉型爲接口類型
- 向上轉型必定會成功,是一個隱式轉換
- 向上轉型後的對象,將只能訪問父類或者接口中的成員
向下轉型繼承
- 由父類類型轉型爲子類類型,或者由接口類型轉型爲實現類類型
- 向下轉型可能會失敗,是一個顯式轉換
- 向下轉型後的對象,將能夠訪問子類或者實現類中特有的成員
針對於向下轉型的。教程
若是向下轉型不成功,會怎樣?接口
- 會有一個異常 ClassCastException
如何避免這種狀況?io
- 在向下轉型以前,咱們先判斷一下這個對象是否是要轉型的類型
怎麼判斷?ast
關鍵字 instanceofclass
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 接口名字 { // 接口中的成員 }1. 訪問權限修飾符:和類同樣,只能有 public 和默認的default權限。 2. 接口不是類,不能實例化對象。 3. 接口,暫時和類寫成平級的關係。 4. 接口名字是一個標識符,遵循大駝峯命名法接口中成員的定義:
- 屬性:接口中的屬性,默認的修飾符是 public static final
- 構造方法:接口中不能寫構造方法
方法:
- 接口中的方法都是抽象方法
- 接口中的方法訪問權限修飾符都是public
接口是須要被類來實現的。
實現接口關鍵字: implements
讓類實現接口:
public class Shunfeng extends Company implements Express { }
- 一個非抽象類在實現接口後,須要實現接口中全部的抽象方法。
一個類在繼承自一個父類後,還能夠再去實現接口。
- 若是同時有父類和接口,那麼繼承父類在前,實現接口在後
一個類能夠實現多個接口
- 若是一個類實現的多個接口中有相同的方法,這個方法在實現類中只須要實現一次便可。
接口之間是有繼承關係的,並且接口之間的繼承是多繼承。
public interface GrilFriend extends HouseKeeping, Takecare { }