JAVA向上轉型和向下轉型(一)
在我們工作的時候通常會看到這樣的程式碼:
Map<String,Object> m = new HashMap<String,Object>();
List<Object> l = new ArrayList<Object>();
question1: m和 l 是 物件嗎?不要急於回答問題,請看下面兩行程式碼:
Human human;
human = new Human("亞當");
這兩行程式碼等同於:Human human = new Human("亞當");
question2:我們知道在Java中new是用來在堆上建立物件用的,如果human是一個物件的話,為什麼還要再通過new來 創 建呢?如果不是物件,那麼human是什麼?如同question1中所問: m和l是什麼?
“每種程式語言都有自己的資料處理方式。有些時候,程式設計師必須注意將要處理的資料是什麼型別。你是直接操縱元素,還是用某種基於特殊語法的間接表示(例如C/C++裡的指標)來操作物件。所有這些在 Java 裡都得到了簡化,一切都被視為物件。因此,我們可採用一種統一的語法。儘管將一切都“看作”物件,但操縱的識別符號實際是指向一個物件的“引用”(reference)。”——《JAVA程式設計思想》
沒錯,m、l和 human 不是物件,他們是物件的引用變數,human是指向“亞當”物件(Human 類的一個例項)的引用。他們不在堆中,一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配。
現在我建立一個兩個類 Man和 Woman 繼承 Human。請看下面程式碼:
Human h;
h = new Man("亞當");
建立了一個 Human的引用 h 然後又將h指向了一個Man物件的例項(亞當);一個父類引用指向了一個子類物件,也就是說把子類轉化成了父類來用,這就叫做“向上轉型”。 什麼是向下轉型呢?
向下轉型:父類引用的物件轉換為子類型別稱為向下轉型。請看向下轉型的例子:
1. Man m = (Man) h;
2. Human h1 = newHuman("夏娃");
3. Woman m = (Woman)h1;
未完待續!!!