Java 從入門到進階之路(十五)
在之前的文章我們介紹了一下 Java 中的介面,本章我們來看一下 Java 中類的多型。
在日常生活中,很多意思並不是我們想要的意思,如下:
1、領導:“你這是什麼意思?”
小明:“沒什麼意思,意思意思。”
領導:“你這就不夠意思了。”
小明:“小意思,小意思。”
領導:“你這人真有意思。”
小明:“其實也沒有別的意思。”
領導:“那我就不好意思了。”
小明:“是我不好意思。”
2、電視劇《快把我哥帶走》
妹:“你根本就不懂我。”
哥:“你不說我怎麼懂你啊,”
妹:“真的懂不需要說出來,”
哥:“你說了我不就懂了嗎?”
妹:“說出來有什麼意思啊,我不說你也應該懂。”
哥:“我又不是算命的,我知道你幾個意思啊,”
妹:“我沒什麼意思,”
哥:“確實沒什麼意思。”
妹:“現在我說話你覺得沒意思了嗎?”
哥:“是我說沒意思?”
妹:“那我說沒意思,就是沒意思嘛?”
哥:“那你倒是告訴我你到底幾個意思啊。”
。。。
對於不同的職業,當我們聽到不同的詞時也會想到不同的意思,比如 cut,對於醫生來說就是動刀做手術,對於裁縫來說就是裁剪衣服,對於演員來說就是暫停表演,這就是多型作為行為的一種表現,還有當我們聽到水這個物件時,作為業態可以洗臉,作為固態可以降溫,作為氣態可以蒸饅頭,這就是多型作為物件的一種表現。
多型:
1、意義
1)同一型別的引用指向不同的物件時,有不同的行為 ----- 行為的多型。
2)同一物件被造型為不同的型別時,有不同的表現 ----- 物件的多型。
2、向上造型:
2.1)父型別的引用指向子類的物件
2.2)能造型成的型別有:父型別、實現的介面。
2.3)能點出來什麼,看引用的型別
3、強制型別轉換,成功的條件有兩個:
3.1)引用所指向的物件,就是該型別
3.2)引用所指向的物件,實現了改介面
4、通過 instanceof 來判斷引用是否是某種型別,instanceof 返回 boolean 結果,強轉成功的條件時它為 true 的條件。
1 abstract class people { 2 abstract void cut(); 3 } 4 5 class doctor extends people { 6 void cut() { 7 } // 做手術 8 } 9 10 class actor extends people { 11 void cut() { 12 } // 停止表演 13 } 14 15 class barber extends people { 16 void cut() { 17 } // 理髮 18 }
在上面的程式碼中,我們其實就是做了一個行為多型的程式碼,對於不同型別的人來說,cut() 方法具有不同的行為。
1 interface yetai { // 液態介面 2 void xilian(); 3 } 4 5 interface gutai { // 固態介面 6 void jiangwen(); 7 } 8 9 interface qitai { 10 void zhengmantou(); // 氣態介面 11 } 12 13 class water implements yetai, gutai, qitai { 14 public void xilian() { 15 } 16 17 public void jiangwen() { 18 } 19 20 public void zhengmantou() { 21 } 22 }
在上面的程式碼中,我們建立了液態,氣態,固態三個介面,並且每個介面都有各自的方法,然後我們通過各自的介面例項化 water,可以看出不同介面可以實現各自的 water 例項,但是並不能去訪問另一個例項裡的方法,這就是 同一物件被造型為不同的型別時,有不同的表現,但是如果我們非要呼叫其他接口裡的方法呢,比如在上面的程式碼中我們非要讓 yetai 的 water 具有 jiagwen 功能,當然在實際生活中確實有這樣的功能,
我們可以通過強制型別轉換的方法來實現上面的問題。如下:
1 public class HelloWorld { 2 public static void main(String[] args) { 3 yetai water = new water(); 4 gutai water1 = (gutai) water; 5 water1.jiangwen(); 6 } 7 } 8 9 interface yetai { // 液態介面 10 void xilian(); 11 } 12 13 interface gutai { // 固態介面 14 void jiangwen(); 15 } 16 17 interface qitai { 18 void zhengmantou(); // 氣態介面 19 } 20 21 interface qitai1 { 22 void zhengmantou(); // 氣態介面 23 } 24 25 class water implements yetai, gutai, qitai { 26 public void xilian() { 27 } 28 29 public void jiangwen() { 30 } 31 32 public void zhengmantou() { 33 } 34 }
我們通過 gutai water1 = (gutai) water; 將 yetai water 強轉為 gutai water ,這樣就可以實現 jiangwen 功能了