向上轉型,其實說簡單點就是把繼承的子類轉換成基類的過程,舉個例子以下(摘自JAVA編程思想第四版 T139):編程
class Instrument{ public void play(){ System.out.println("I'm playing!~");} static void tune(Instrument i){ i.play();} } public class Wind extends Instrument{ public static void main(String[] args){ Wind wind = new Wind(); Instrument.tune(wind); } }
輸出的是:I‘m playing!~,注意這裏的形式參數是Instrument,而咱們實際傳入的參數是Wind,在這裏就存在的一個向上轉型。ide
ok,某些人可能會有疑問了,若是我基類中有個人private成員怎麼辦,這樣的話不就轉換不了了麼?spa
對,若是是對於純粹的privatec成員咱們確實是不能轉換,可是咱們在使用private成員的時候不是經常經過方法訪問他麼?否則這個私有成員在這裏面起什麼做用呢?咱們根本就沒有任何藉口去訪問他,那麼這個定義的這個私有成員就是沒有意義的,因此咱們根本就不須要考慮這個問題。code
向上轉型說了,接下來講一下向下轉型。由名字就能夠知道,向下轉型就是把基類對象轉換成個人繼承子對象,可是這其中又存在不少問題。對象
向上轉型會丟失個人類型信息,而咱們能不能經過向下轉型來得到個人類型信息呢?答案是不必定,這其中存在必定的限制條件,那就是你向下轉型的對象必須是由繼承對象賦值或初始化得來的,不然的話向下轉型不成功,會拋出一個ClassCastException異常。 blog
下面也給一個向下轉型的例子,代碼以下`繼承
1 class Useful{ 2 public void f(){} 3 public void g(){} 4 } 5 6 class MoreUseful extends Useful{ 7 public void f(){} 8 public void g(){} 9 public void u(){} 10 } 11 12 public Class RTTI{ 13 public static void main(String[] args){ 14 Useful [] x = { new Useful(),new MoreUseful()}; 15 x[0].f(); 16 x[1].g(); 17 //Error:x[1].u(); 18 ((MoreUseful)x[1]).u(); //向下轉型成功 19 //((MoreUseful)x[0]).u(); 拋出classCastException 20 } 21 }