天天看點

Java中的向上轉型 & 向下轉型 ( OOP )

Java中的向上轉型 & 向下轉型 ( OOP )
Java中的向上轉型 & 向下轉型 ( OOP )

分析和結論:

(一)向上轉型

(1)定義:把對某個對象的引用視為對其基類引用的做法被稱為“向上轉型”。

這主要是由于子類的對象可以看成是基類的對象這原因而得來的,也就是具有is-a關系。

比如:

Useful useful = new MoreUseful();//右邊是一個子類的對象,而左邊是一個父類類型

//的變量,指向右邊的子類對象。

(2)導出類可以接收發給基類的任何消息,因為二者有完全相同的接口,我們隻需要

從導出類向上轉型,永遠不需要知道正在處理的對象的确切類型,這也就是多态性決

定的。利用多态性,具有同樣方法名和方法特征的方法根據調用方法的對象的類型,

可以産生不同的動作,這極大地增加了程式員的表達能力。

回頭再看一看上面這個例子中的一段for循環代碼,

for(inti=0;i<x.length;i++)

{

if(x[i] instanceofMoreUseful2)  //判斷instanceof左邊的對象是否是右邊的類的執行個體。

MoreUseful2 moreuseful2 =(MoreUseful2)x[i];  //向下轉型(具體解釋見下面的分析)

moreuseful2.u();

}

x[i].g();//動态綁定

主要看x[i].g();這一句話,現在我們還不知道x[i]這個到底是指代哪一個Useful對象,

在這種情況下,編譯器是怎麼知道調用哪個方法的呢?這是一個動态綁定的問題,見

下面。

(二)動态綁定

(1)定義:将方法的調用和方法主體關聯起來就是動态綁定。

比如:x[i].g();這就是一個動态綁定,x[i]是一個對象類型,g()是一個不知道是屬于

哪個對象的方法,将這兩個兩個聯合在一起,就是一個綁定。

(2)要注意:Java中除了static和final方法(private方法屬于final方法,因為fianl方法

不可以覆寫,static方法是一個全局方法,屬于所有類共享,不在多态範圍内)之外,

其他所有的方法都是動态綁定,這就意味着在通常情況下,我們不必判定是否應該進

行動态綁定,因為這個會自動發生。

(3)接着上面的答複。編譯器是怎麼知道調用哪個方法的呢?

主要還是x[i].g();這一句話的作用,x[i]在調用方法的時候,會調用“實際”的方法,這

個實際的方法由所引用的對象的類型決定。那麼調用的實際方法可能是父類中沒有被

子類覆寫的方法,也可能是子類中覆寫父類的方法,主要看調用這個方法的實際的對

象類型是哪一個。

(三)向下轉型

既然有向上轉型,那麼有沒有向下轉型呢?

答:有

(1)概述

繼承可以確定所有的子類類具有基類的接口,且絕對不會少。那麼子類除了有父類的

方法,也可以有自己的額外的新方法(這些方法是基類所沒有的),那麼一旦向上轉

型,就不能調用子類中的新方法,那麼能不能用一種方式調用這些新方法呢?當然有

了,這時候就需要向下轉型。

(2)向下轉型

将超類的引用強制轉換為子類類型就叫做向下轉型。

注意:将超類的引用賦給為子類類型的變量(沒有進行顯示地強制轉換)是一個編譯

錯誤。

例子:

還是上面的for循環代碼

for(int i=0;i<x.length;i++)

if(x[i] instanceof MoreUseful2)//判斷instanceof左邊的對象是否是右邊的類的執行個體。

MoreUseful2 moreuseful2 = (MoreUseful2)x[i];// 向下轉型

x[i].g();

分析:x[i]可以代表具體的Useful對象類型,當它是MoreUseful2或ExtendsMoreUseful2

對象類型時,就可以調用該對象的額外方法u(),v(),w(),也就是當對象x[i]和Moreusful對

象存在is-a關系時,才可以進行向下轉型,如果要轉換的對象類型與指定的對象類型不

存在is-a關系時,會産生一個ClassCastException異常。

總之:

向下轉型時,對象隻能強制轉換為其本身類型或者其超類類型。比如,

當x[i]ExtendsMoreUseful2對象時,可以把他轉換為其本身ExtendsMoreUseful2對象類

型,也可以把它轉換為其基類MoreUseful2類型。但是在編譯時候還不知道這個x[i]是代

表那個具體對象類型隻知道這個x[i]是基類類型引用,是以要用這樣的形式" (想要要得

到的類型)x[i] " 進行轉換。x[i]在這裡是就我這個例子來說明的,你也可以使用其它的

英文代替,其意義是一切符合規定的需要被轉換的對象。