天天看點

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 {