JAVA中的向上轉型和向下轉型

  向上轉型,其實說簡單點就是把繼承的子類轉換成基類的過程,舉個例子以下(摘自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 }
View Code
相關文章
相關標籤/搜索