「Java三分鐘」Java三大特性——多態理解

2020-12-03 熊喵不是貓嘍

不積跬步,無以至千裡。關注我,每天三分鐘,帶你輕鬆掌握一個Java相關知識點。

多態顧名思義,指多種狀態。一個東西被人類創造,一定為了解決某種問題的,那麼多態存在是為了解決什麼問題呢?換言之,多態存在的意義是什麼?

假如我們想要寫一個讀小說的場景:

先寫兩個個小說類:

再寫一個讀書的人的類,這裡我們通過方法的重載,來支持該人閱讀不同的小說。

最後寫一個Main方法

運行結果:

小夥伴們可能都發現了,這樣設計程序有很大的問題,一兩本書可能沒差別,但以後可能會讀成千上萬本書,如果在Persion類中一直添加重載方法是非常可怕的。然而我們怎麼利用多態來解決這個問題呢?

我們可以想一下,人類read這個方法就是接受小說這個對象,那麼我們能不能所有的小說抽象成一個類,並通過對這個類的不同實現來實現一種運行層面的動態呢?

我們嘗試下這麼做:

運行結果:

看!我們以後再也不用打開Persion類無限重載方法了,只要有新的小說,我們就讓它繼承Book類,重寫書名,再替換紅框部分就可以了。

通過上述例子,我們能總結出多態存在的意義有哪些了:

1.省心了。我們不用再去關心到底要讀那一本書了,只要把book對象傳進來,具體那一本根本不關心。這也就是大家常說的不關心子類具體情況,可以無腦用父類,等用到子類特有的方法的時候,強轉一下就行。

2.省力了。我們在拓展小說的時候,不用再想getName怎麼建立了,直接重寫就可以。這個例子中可能不明顯,在現實開發中,父類抽象出的方法可能有很多,這個時候就能省不少力氣。

3.拓展性高了。這個需要自己領會,要把代碼寫靈活的方式方法有很多,好多的設計模式就是為了做成這件事,多態的存在也是有這個層面的意思,你會發現它把子類放開了,你可以用這個父類放飛自我,搞一些奇奇怪怪的書來讀(繼承)。

但是,在使用多態的時候,也不是為所欲為,它有幾個必要條件:

1.繼承。你必須有父類子類這種關係,才能搞多態。

2.重寫。重寫的意義就是你之所以弄出個子類,無外乎父類不能滿足,所以重寫父類不滿足的那一部分意義就在這。

3.轉型。你需要把子類對象交給父類引用,才能子類父類都使用。

以上就是今天的知識點,各位小夥伴get到嗎?創作不易,望各位多多點讚收藏,有什麼建議可以留言告訴我,我會積極採納!

相關焦點

  • 深入分析java中的多態(從jvm角度分析)
    對於java中多態概念的理解一直是面試常問的問題,所以今天花了一些時間好好地整理了一下,力求從java虛擬機的角度來分析和理解多態。一、認識多態1、方法調用在Java中,方法調用有兩類,動態方法調用與靜態方法調用。
  • 用經典案例來幫助初學者解析Java的「多態」
    說到Java的「多態」特性,很多人都十分熟悉、了解;也有很多人仍然在理解或闡述時對此含糊不清。我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。這就是不同之類之間體現出來的多態。在代碼上體現就是方法名稱,參數,返回值完全與父類相同,而不同的子類在方法體內的代碼邏輯不同。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • 必學——Java抽象類、接口、多態
    如果實現多個接口,用逗號隔開接口名,如:class A implements Printable,Addable{…}(3)、接口特性–接口不可以被實例化–實現類必須實現接口的所有方法–實現類可以實現多個接口–接口中的變量都是靜態常量(4)、編碼實現3、多態:同一個引用類型,使用不同的實例而執行不同操作(1)使用多態實現思路
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    對多態理解不夠深入的,多半都會答錯;如果能記住口訣:「變量多態看左邊,方法多態看右邊,靜態多態看左邊」的話,肯定就知道答案,但是JVM是如何確定具體調用哪個方法的,有小夥伴思考過嗎?這個特性給Java帶來了更強大的動態拓展能力,也使得Java方法調用過程變得相對複雜起來,需要在類加載期間,甚至到運行時才能確定目標方法的直接引用。2、解析:所有方法調用中的目標方法在Class文件裡面都是一個常量池中的符號引用,在類加載的解析階段,會將其中的一部分符號引用轉換為直接引用(相當於指針)。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    各位讀者老爺們大家好鴨~圖圖又來了,今天我們要說一下「多態」。怎麼理解這兩個字呢?可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。
  • Java-類型轉換,使用強制向下轉型解決多態的弊端
    瀏覽器版本過低,暫不支持視頻播放1.1.java的類型轉換1.1.1.java的類型轉換自動向上轉型: 可以直接將子類型引用賦值給父類型變量,可以自動進行,叫做自動向上轉型;例如:class Fu{}class Zi extends Fu{}
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • 重學Java 設計模式:實戰命令模式「模擬高檔餐廳八大菜系,小二點單...
    二、開發環境JDK 1.8Idea + Maven涉及工程三個,可以通過關注「公眾號」:bugstack蟲洞棧,回復源碼下載獲取(打開獲取的連結,找到序號18)三、命令模式介紹命令模式,圖片來自 refactoringguru.cn命令模式在我們通常的網際網路開發中相對來說用的比較少,但這樣的模式在我們的日常中卻經常使用到,那就是Ctrl+C、Ctrl
  • Java基礎知識學習:Java三大特效之多態!
    1.1 多態的形式多態是繼封裝、繼承之後,面向對象的第三大特性。多態是出現在繼承或者實現關係中的。1.4 多態的好處實際開發的過程中,父類類型作為方法形式參數,傳遞子類對象給方法,進行方法的調用,更能體現出多態的擴展性與便利。
  • Java中的面向對象三大特性之多態
    如下圖:從上例中可以看出,父類的引用指向哪個類的實例就調用哪個類中的方法;同樣是使用父類的引用,調用同一個名稱的方法,卻可以得到不同的調用結果,這就是Java中的多態,即:同一函數,多種形態;實際上多態包括動態多態和靜態多態。
  • Java反射機制深入詳解
    反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變量和方法並且顯示出來。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
  • Java多態性理解
    Java中多態性的實現什麼是多態面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最後一個概念,也是最重要的知識點。多態的定義:指允許不同類的對象對同一消息做出響應。
  • 詳細介紹Java多態性(二)
    三、總結1、通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。這裡你可以這樣理解,相當於把不是父類中含有的函數從虛擬函數表中設置為不可見的。注意有可能虛擬函數表中有些函數地址由於在子類中已經被改寫了,所以對象虛擬函數表中虛擬函數項目地址已經被設置為子類中完成的方法體的地址了。
  • Java基礎,類的繼承,粗略的理解希望對大家有所幫助!
    Java基礎:繼承讀者老爺們大家好,今天圖圖帶大家了解一下java基礎裡的繼承。首先確定一下我們今天的學習的三個目標。第一個是類的繼承;第二個是訪問控制權限;第三個方法重寫(覆蓋)override。好滴,話不多說,讓我們快樂的投身知識的海洋裡吧!
  • 「JAVA」萬字長篇詳述字節碼對象與反射機制完成動態編程
    Java 反射在Java的開發環境中,運行java文件需要使用:java xx.java 命令,運行java命令後根據JVM規範,Java 程序的整個生命周期會經歷5個階段:加載 -> 連結(驗證、準備、解析) -> 初始化 -> 使用 -> 卸載;因為在連結階段會有驗證、準備、解析三個步驟,所以也可以說Java 程序的生命周期會經歷7個階段(使用驗證、準備、解析三個步驟來替代連結階段)。
  • 萬字概覽 Java 虛擬機
    Stack 為什麼是線程私有的,這涉及到「棧上分配」和「TLAB」兩個概念。棧上分配所謂棧上分配就是允許將對象直接分配在棧上,而不用分配到 Heap 中。這樣對象會隨著棧幀的出棧自動銷毀,不用等待 GC 進行回收,從而提高性能。但是要實現棧上分配是非常複雜的,涉及到「逃逸分析」和「標量替換」兩項技術。
  • Java8 lambda表達式語法
    文中如有錯誤和理解偏差的地方,希望大家幫忙指出,我會持續修改和優化。本文是該系列的第一篇,主要介紹Java8對屌絲碼農最有吸引力的一個特性—lambda表達式。java8的安裝工欲善其器必先利其器,首先安裝JDK8。過程省略,大家應該都可以自己搞定。