從頭再來:Java的多態(有個測試你不一定能答對)

2020-12-03 Java猿猿

關於Java的多態,首先問自己2個問題:什麼是多態?多態解決的問題是什麼?

老規矩先來一個簡單的小測試,程序的執行結果是什麼?

測試一下

你的回答是否正確呢?如果不完全對咱們就接著往下看,先回答最開始的兩個問題。

多態是相同的行為但是卻有不同的表現,比如吃東西,羊吃草,狼吃肉。那為什麼用多態呢?

多態還是有些好處的,多態分離做什麼和怎麼做,也就是接口的定義和實現的分離。這樣不但能改善代碼結果和提高閱讀性,還能構建可擴展的應用程式。

實現一個多態的例子

創建動物的基類,定義一個吃東西的方法eat。創建一個類羊並繼承動物類,重寫方法eat。在創建一個狼並基礎動物類,也重寫方法eat。

多臺的例子

從上面的例子看到testEat方法中的參數是動物類,在運行的時候參入的是羊和狼,最後執行的是羊和狼的eat方法,這個就是多態。

多態的必要條件為:

繼承(或者實現接口)。重寫基類的方法(或者實現接口的方法),這個強調的是方法,變量不能實現多態。父類的引用指向子類(或者實現類),通過運行時決定傳入的是哪個具體的類型。構造器和多態

構造器不同於其他的方法,它實際上是隱式的靜態方法,不具有多態性。但是又必須要了解在繼承中構造方法的初始化順序。

在實例化子類的時候,會檢查是否有父類,如果有就會先初始化父類,以此向上查找並初始化。

如果我們在沒有初始化的時候調用多態的方法會發生什麼?開始的測試的結果已經說明問題了,為什麼會id是null,而不是1,因為類初始化之前對象的引用為null,基本類型的值為0。

歡迎留言討論,如果有任何錯誤,請批評指正,謝謝!

相關焦點

  • 深入分析java中的多態(從jvm角度分析)
    我們舉個例子來解釋,就是一對夫婦生了多胞胎,多胞胎之間外觀相似,其實是不同的孩子。(2)Java的方法重寫(父類與子類之間的多態):子類可繼承父類中的方法,但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。重寫的參數列表和返回類型均不可修改。我們再舉個例子,就是子承父業,但是兒子有自己想法,對父親得產業進行再投資的過程。
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。這個時候就會有不同的子類重寫的功能是不同的。我們來舉個例子,父類是動物類,有一個叫的方法。然後定義兩個子類繼承自這個父類,一個貓類、一個狗類。他們分別對叫的方法做了重寫,貓類重寫叫的方法是發出「喵喵」聲,而狗類重寫叫的方法是發出「汪汪」聲。
  • 用經典案例來幫助初學者解析Java的「多態」
    說到Java的「多態」特性,很多人都十分熟悉、了解;也有很多人仍然在理解或闡述時對此含糊不清。我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    各位讀者老爺們大家好鴨~圖圖又來了,今天我們要說一下「多態」。怎麼理解這兩個字呢?可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • 必學——Java抽象類、接口、多態
    若abstract類的類體中有abstract方法,只允許聲明,而不允許實現。2、接口Java不支持多繼承性,即一個類只能有一個父類。單繼承性使得Java簡單,易於管理程序。(1)、接口的聲明與使用接口通過使用關鍵字interface來聲明,格式:interface 接口的名字{}(2)、一個類通過使用關鍵字implements 聲明自己實現一個或多個接口。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    先來個引子:下面是騰訊的一道面試題。對多態理解不夠深入的,多半都會答錯;如果能記住口訣:「變量多態看左邊,方法多態看右邊,靜態多態看左邊」的話,肯定就知道答案,但是JVM是如何確定具體調用哪個方法的,有小夥伴思考過嗎?
  • Java多態性:Java什麼是多態?
    對面向對象來說,多態分為編譯時多態和運行時多態。其中編譯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的方法。通過編譯之後會變成兩個不同的方法,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是大家通常所說的多態性。Java 實現多態有 3 個必要條件:繼承、重寫和向上轉型。
  • Java-類型轉換,使用強制向下轉型解決多態的弊端
    瀏覽器版本過低,暫不支持視頻播放1.1.java的類型轉換1.1.1.java的類型轉換自動向上轉型: 可以直接將子類型引用賦值給父類型變量,可以自動進行,叫做自動向上轉型;例如:class Fu{}class Zi extends Fu{}Zi zi = new Zi();Fu f = zi;//這行代碼就發生了自動向上轉型強制向下轉型: java中允許將父類型引用賦值給子類型變量,叫做向下轉型;但是這種轉型不能自動實現,需要強制進行
  • 「Java三分鐘」Java三大特性——多態理解
    不積跬步,無以至千裡。關注我,每天三分鐘,帶你輕鬆掌握一個Java相關知識點。多態顧名思義,指多種狀態。一個東西被人類創造,一定為了解決某種問題的,那麼多態存在是為了解決什麼問題呢?換言之,多態存在的意義是什麼?
  • Java基礎知識學習:Java三大特效之多態!
    1.2 多態的案例演示當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫後方法。如果子類沒有重寫該方法,就會調用父類的該方法。總結起來就是:編譯看左邊,運行看右邊。
  • Java繼承多態編程題
    題目1:請使用多態實現以下需求:小明有兩個很要好的朋友。一個是中國的王小強,喜歡吃四川菜,練太極拳;一個是美國的約翰,喜歡吃比薩,打橄欖球。每當朋友來拜訪小明時,小明都會按各人的喜歡接待他們。題目2:創建一個印表機類Printer,定義抽象方法print( ),創建兩個子類,即針式印表機類DotMatrixPrinter和噴墨印表機類InkpetPrinter,並在各自類中重寫方法print( ),編寫測試類實現兩種印表機列印。
  • Java面向對象之:封裝、繼承、多態
    訪問權限修飾符應封裝的隱藏細節的理念,java提供了訪問權限修飾符來控制調用者的訪問權限,詳情如下:private:屬於類訪問權限,表示私有的,只能在當前類中訪問,使用private修飾的類、方法、欄位,在』離開當前類的作用域之後
  • Java中的多態有哪些具體表現形式
    學習Java語言的過程中,對於多態的理解是非常關鍵的,理解了多態也就意味著打開了理解Java各種「抽象」的大門。所謂的「多態」,簡單的理解就是對象在不同情況下的不同表現,具體體現在定義和功能兩個方面,簡單的總結一下,多態可以用「三個定義和兩個方法」來總結。三個定義分別是父類定義子類構建、接口定義實現類構建和抽象類定義實體類構建,而兩個方法分別是方法重載和方法重寫。
  • Thinking In Java --- 多態(筆記)
    若在程序執行前進行綁定(如果有的話,由編譯器和連接程序實現),叫做前期綁定。多態使用情況下,編譯器通過後期綁定來確定對象的具體類型。後期綁定,它的含義就是在運行時根據對象的類型進行綁定。後期綁定也叫做動態綁定或運行時綁定。如果一種語言想實現後期綁定,就必須具有某種機制,以便在運行時能判斷對象的類型,從而調用恰當的方法。
  • Java多態接口習題
    1、已知有Master主人類,包括屬性:name(名字)、money(元寶值)Pet(父類),包括如下屬性:name、health(健康值)、love(親密度)。要求應用繼承與多態技術實現:主人給寵物看病2、假設動物園某管理員(Master類)每天需要給他所負責飼養的獅子(Lion),猴子(Monkey),鳥(Bird)餵食,用一個程序模擬餵食過程。
  • 多態是什麼 父類如何調用子類的方法(美團面試))
    引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自「Delphi4 編程技術內幕」)。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • 黑馬程式設計師:Java學科-多態的定義格式以及向上、向下轉型
    用飛為例子的話,飛機與鳥的飛行也是不一樣的。所以,通過不同的事物,可以體現出來的是不同的形態。多態就是描述這樣的狀態。定義多態:是指的同一行為具有多個不同表現形式前提【重點!】多態體現的格式:父類類型:指子類對象繼承的父類類型,或者是實現父的接口類型代碼如下所示:當使用多態方法調用方法的時候,首先要檢查父類中是否有該方法,如果沒有這個方法,那麼編譯錯誤;如果有的話,執行的是子類重寫以後的方法。