「程式設計師之路」17什麼叫多態?

2020-12-03 劉小愛

面向對象三大特性:封裝、繼承和多態。

今天學最後一個特性:多態。

什麼叫多態呢?按照字面意思理解就是多種形態的意思。

還是舉昨天的那個例子:

動物園裡動物都得吃食物,兔子吃胡蘿蔔,貓吃魚,狗吃肉。

同一行為(吃東西),通過不同的事物(兔,貓,狗),可以體現出不同的形態(兔子吃胡蘿蔔,貓吃魚,狗吃肉),這就叫多態

一、多態的格式

1.格式說明:父類引用指向子類對象。

具體什麼意思呢?

變量有基本數據類型和引用數據類型。

其中引用數據類型又分為:數組,類和接口。

父類類型指的是子類繼承至的父類,或者子類實現的接口。

按照現實裡面的理解就是:一個是親爹一個是乾爹。

2.要存在方法重寫

其中父類引用(也就是圖中的Zoo)在調用方法時,會先看自己有沒有這個方法(eat方法)。

如果沒有eat()方法,編譯會報錯;

如果有這個方法,會執行子類重寫後的方法,

口訣就是:編譯看左邊,運行看右邊

就比如上圖中:zoo.eat()

①編譯會先看左邊,Zoo接口中有沒有eat()方法,有,編譯通過。

②運行結果看右邊,是Rabbit對象,那麼會執行Rabbit中重寫的eat()方法,也就是「兔子吃胡蘿蔔」。

二、多態的好處

既然是面向對象三大特性,那它有啥好處呢?

當父類類型作為方法形式參數時,更能體現出多態的擴展性與便利。

現在要展現動物的eat()方法和sleep()方法。

如果不使用到多態,常規用法,代碼如下:

就是每一個動物都得建立一個對象,並且建立其對象對應的show()方法。

那麼問題來了,動物園裡那麼多動物,每個動物都建一個show()方法,會顯得特別繁瑣。

如果應用到多態的話,就會簡單很多。

代碼如下:

每一個動物就建立對象,但是只需要一個show()方法就可以了。

show()方法參數是父類類型的引用。

這樣無論建立多少個動物對象,只要是子類,都可以將參數傳入這個方法,直接使用。

這就叫代碼的可拓展性,以後無論是刪減哪種動物,或者是添加哪種動物,這個方法都可以使用,不用改變。

三、多態的弊端

多態這麼方便,那它有沒有什麼弊端呢?

是有的。多態不能調用子類的特有方法,需要使用到強制轉換。

兔類中有一個特有的方法jump(),兔類的父接口Zoo中沒有這個方法。

那麼父類引用zoo就不能調用這個特有的方法。

需要使用到強制轉換,也就是(Rabbit)zoo。

格式為:(類型名)變量名。

注意:

上面這段代碼,編譯是沒有問題的,但是運行會報錯。

ClassCastException,中文就是:類轉換異常。

其實很好理解,變量zoo定義的時候,本來是子類dog對象,現在強制轉換成子類Rabbit,自然沒法運行。

為了避免出現類轉換異常,Java提供了一個關鍵字:instanceof,給變量名做類型的校驗。

格式為:變量名 instanceof 類型

如果變量屬於該類型,返回true;如果變量不屬於該類型,返回false。總結:

相關焦點

  • JavaScript正則表達式「程式設計師培養之路第十二天」
    圖六第六節 支持正則的 String方法JavaScript字符串「程式設計師培養之路第十一天」JavaScript數組「程式設計師培養之路第十天」JavaScript分支循環「程式設計師培養之路第九天」
  • 面向對象的編程-多態「程式設計師培養之路第四十四天」
    在面向對象語言中,多態就是把子類對象賦值給父類引用,然後調用父類的方法,去執行子類覆蓋父類的那個方法。
  • 如何給女朋友解釋什麼是面向對象編程?
    比如我要描述一個人,「數據」就是他的年齡、性別、身高體重,「能力」就是他能做什麼工作,承擔什麼樣的責任。描述一個外賣軟體,「數據」就是他包含的菜品,而「能力」就是他可以點菜。什麼是封裝?面向對象真正有威力的地方是「繼承」和「多態」。舉一個不是很恰當,但是女朋友比較容易理解的例子。我們使用外賣軟體點餐,當我們第二次去某一家店時,外賣軟體會提示你上一次你在這家點了什麼,你可以點擊<再來一單>把上次的菜品直接加到購物車中,這就是「繼承」。
  • AI「幹掉」程式設計師後,又對藝術家下手了
    因為人們發現有了這些神經網絡,就能通過自然語言操縱視覺概念,比如,你輸入「一把牛油果造型的扶手椅」,它們就能通過圖像合成,「憑空捏造」出一系列的目標圖像。什麼是人工智慧的未來?《麻省理工科技評論》認為就是「那把牛油果造型的扶手椅」,因為 AI 又往「構建多模態 AI 系統」這個長期目標又邁近了一大步。
  • 多態是什麼 父類如何調用子類的方法(美團面試))
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】,經微信公眾號授權轉載,如需轉載與原文作者聯繫作者丨BossXiang 圖丨pexels這道題是來自牛客網的一位小哥在2019的最後一天面試系統開發工程師的補招的一個面試題目,在Java
  • 200 年來,科技圈那些「硬核女神」
    當你看到「程式設計師」這個詞時,腦海是不是浮現出一個男性形象?的確,很多網際網路公司的技術部門裡男性員工佔了 80% 以上,這讓我們幾乎把「程式設計師」和「男性程式設計師」之間畫上了等號。但是,你知道嗎?世界上的第一位程式設計師其實是一名女性。在並不久遠的七十年前,計算機編程還被認為是非常女性化的職業,在隨後的三四十年裡女性一直是這個領域的領軍人物。
  • 「Java三分鐘」Java三大特性——多態理解
    多態顧名思義,指多種狀態。一個東西被人類創造,一定為了解決某種問題的,那麼多態存在是為了解決什麼問題呢?換言之,多態存在的意義是什麼?然而我們怎麼利用多態來解決這個問題呢?我們可以想一下,人類read這個方法就是接受小說這個對象,那麼我們能不能所有的小說抽象成一個類,並通過對這個類的不同實現來實現一種運行層面的動態呢?我們嘗試下這麼做:運行結果:看!
  • 從數學少年到霸道總裁CTO,美洽李令輝的職業之路
    李令輝的數學家之夢破碎了,「在意識到自己沒可能成為數學家的那一刻,我的整個世界都暗淡無光了」。好在少年的愁滋味都不會延續太久,很快他就找到了新的樂趣之源:根據插卡式學習機的說明書上的幾行編程指導,他對著電視機屏幕,敲擊學習機鍵盤,開發出了一套射擊遊戲,依靠同學們地下偷摸相傳,這套遊戲很快風靡了他所在學校的轄區。李令輝也就此開始了自己的程式設計師之路。
  • Thinking In Java --- 多態(筆記)
    在面向對象的程序設計語言中,多態是繼數據抽象和繼承之後的第三種基本特徵。多態通過分離做什麼和怎麼做,從另一個角度將接口和實現分離開來。多態不但能夠改善代碼的組織結構和可讀性,還能夠創建可擴展的程序----即無論在項目最初創建時還是在需要添加新功能時都可以「生長」的程序。
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。我們來舉個例子,父類是動物類,有一個叫的方法。然後定義兩個子類繼承自這個父類,一個貓類、一個狗類。他們分別對叫的方法做了重寫,貓類重寫叫的方法是發出「喵喵」聲,而狗類重寫叫的方法是發出「汪汪」聲。於是我們同樣創建的動物的對象,同樣調用這個動物對象叫的方法,如果這個動物對象是貓,則會發出「喵喵」聲,而如果這個動物對象是狗,發出的聲音則成了「汪汪」。
  • 黑馬程式設計師:Python封裝、繼承和多態以及類方法等習題
    繼承 D.多態3.以下C類繼承A類和B類的格式中,正確的是()。什麼是繼承?請簡述私有屬性無法訪問的原理。什麼是多態?請簡述實例方法、類方法和靜態方法的區別。五、編程題設計一個表示動物的類:Animal,其中內部有一個color(顏色)屬性和call(叫)方法。再設計一個Fish(魚)類,該類中有tail(尾巴)和color屬性,以及一個call(叫)方法。
  • 二十年前的全民學英語風潮,如今變成了「學 Python」
    當代人的知識焦慮中,一定少不了這門叫 Python 的語言。朋友圈隔幾天就出現的「Python 訓練營」廣告和評論區熱鬧的互動,總給人一種全民學 Python 的錯覺。(著名程式設計師 Bruce Eckel 更早的時候說過「Life is short You need Python」)這句名言就出自 Python 之父吉多·范羅蘇姆(Guido van Rossum),看到這個「範」姓想必很多人都能猜出他的國籍了——荷蘭。
  • 黑馬程式設計師:Java學科-多態的定義格式以及向上、向下轉型
    今日內容:三大特徵---多態引用類型轉換教學目標:能夠說出使用多態的前提條件理解多態的向上轉型理解多態的向下轉型一、多態1.概述引入:多態是繼封裝,繼承之後,面向對象的第三大特性多態就是描述這樣的狀態。定義多態:是指的同一行為具有多個不同表現形式前提【重點!】
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    對多態理解不夠深入的,多半都會答錯;如果能記住口訣:「變量多態看左邊,方法多態看右邊,靜態多態看左邊」的話,肯定就知道答案,但是JVM是如何確定具體調用哪個方法的,有小夥伴思考過嗎?Java中的非虛方法除了使用invokestatic、invokevirtual調用的方法之外還有一種,就是被final修飾的方法,雖然final方法是使用invokevirtual指令來調用的,但是由於它無法被覆蓋,沒有其他版本,所以也無須對方法接收者進行多態選擇,又或者說多態選擇的結果肯定是唯一的。
  • 暴漲的比特幣、特斯拉與被程式設計師統治的世界
    對於這個命題,同樣深受阿西莫夫影響的T先生認為:這種暴力增長核心是,程式設計師在統治著這個世界。他因此發揮想像力討論了以下7個問題: 1、最優秀的人去做什麼了? 2、人類的恐懼是什麼; 3、程式設計師真的在統治世界嗎?
  • 程式設計師喜歡在晚上敲代碼是有科學原因的
    網上流傳著一個段子:「程式設計師就是把咖啡因變為編碼的機器。」如果你問大多數開發人員更喜歡在什麼時候工作,大部人會說他們最高效的時間在晚上,對於那些在工作之餘為開源項目做貢獻的人來說更是如此。文中解釋了為什麼大部分工程師,包括他本人,總是遵循著「吸血鬼的生活作息」來寫代碼。他作為一名自由職業者兼連續創業家,有超過17 年以上的軟體開發經驗,自稱 A Geek with a Hat。這篇文章最後還寫成了一本書,可以在Swizec Teller的網站上購買電子書或實體書籍。
  • 《瘋狂的麥克斯:狂暴之路》「不死老喬」扮演者去世,享年 73 歲
    《瘋狂的麥克斯:狂暴之路》中經典角色「不死老喬」的扮演者,休·基斯-拜恩去世,享年 73 歲。導演 Ted Geoghegan 和 Brian Trenchard-Smith 公布了他的死訊。Geoghegan 在推特上稱這位 73 歲的「澳大利亞電影行業的無名英雄」今日離我們而去。他對拜恩在 1979 版《瘋狂的麥克斯》中扮演的 Toecutter 以及 2015 版《瘋狂的麥克斯:狂暴之路》中扮演的「不死老喬」讚賞有加。
  • 「阿波羅17號」登月影片被爆造假
    最近有網友發現,「阿波羅17號」(Apoll 7)登月任務影片中太空人的面罩,映射出一個人影,而這個「人」疑似沒穿上太空衣,而這就是這是「登月影片造假」的有力證據。據外媒報道,多年來,有部分美國公民並不相信美國人曾經登陸過月球,還認為美國國家航空暨太空總署(NASA)公開的影片是假的。
  • 程式設計師的這108個笑話 你都看得懂嗎?-程式設計師,笑話,編程, ——快...
    15、殺一個程式設計師不需要用槍,改三次需求就可以了。16、C++程式設計師看不起C程式設計師,C程式設計師看不起java程式設計師,java程式設計師看不起C#程式設計師,C#程式設計師看不起美工。周末了,美工帶著妹子出去約會了,一群SX程式設計師還在加班。17、問:如何生成一個隨機的字符串?答:讓新手退出VIM。18、「我給你出個腦筋急轉彎,你說達文西密碼的上面是什麼?」
  • 為什麼成為一名程式設計師這麼困難? —— 從程序新手到準工程師的必經...
    這篇文章很有趣也十分符合我所聽聞的那些「程式設計師辛酸史」,因此決定將這四個階段介紹給大家,希望程序初學者們在進入這條不歸路之前,眼睛要放亮、計劃要周詳,清楚明白在前方等你們的是什麼,做好完全心理準備吧!突然間我們的問題不再是「困難度」,而是「比天高的期望」跟「比地大的夢想」。最重要的是,以上提到的這些工具跟平臺實在太有用,帶領毫無程序開發經驗的初學者們一步步認識變數、條件語句、程序語法。當你一路過關斬將把程序語言基本邏輯跟語法學會的同時,你就會超有成就感、自信心大增,開始有「原來我也行嘛」、「寫程序也不過就這樣」的感覺,基本上覺得自己已經跟「程式設計師」相差不遠了。