Java中的面向對象三大特性之多態

2020-12-06 Java小知識

父/子類中成員方法僅僅同名

父/子類中成員方法同原型

方法覆蓋

在類的繼承體系結構中,如果子類中出現了與父類中有同原型的方法,那麼認為子類中的方法覆蓋了父類中的方法(也稱為方法重寫);

通過子類的實例調用被覆蓋的方法時,將總是調用子類中的方法,而父類中的方法將被隱藏。

區分方法重寫和方法重載

方法覆蓋(重寫)和方法重載是兩個極易混淆的概念,必須嚴格區分;

方法覆蓋出現的前提條件之一是必須有繼承發生的情況下,而且要求父類和子類中的方法必須同原型;

方法重載時,繼承並不是必需的,它只要求方法名稱相同,而參數列表則必須不同,換言之,各方法的原型其實是不同的。

引用轉型

基類的引用可以指向派生類的對象,如:

BaseClass obj = new DerivedClass();

這樣的語句是合法的;

但是派生類的引用則不可以指向基類的對象,如:

DerivedClass obj = new BaseClass();

這樣的語句將引發錯誤。

既然基類的引用可以指向派生類的實例,如果基類和派生類中存在方法覆蓋的情況,那麼通過基類的引用將會調用到哪個類中的方法呢?如下圖:

從上例中可以看出,父類的引用指向哪個類的實例就調用哪個類中的方法;

同樣是使用父類的引用,調用同一個名稱的方法,卻可以得到不同的調用結果,這就是Java中的多態,即:同一函數,多種形態;

實際上多態包括動態多態和靜態多態。

靜態多態靜態多態也稱為編譯時多態,即在編譯時決定調用哪個方法;

靜態多態一般是指方法重載;

只要構成了方法重載,就可以認為形成了靜態多態的條件;

靜態多態與是否發生繼承沒有必然聯繫。

動態多態動態多態也稱為運行時多態,即在運行時才能確定調用哪個方法;

形成動態多態必須具體以下條件:

必須要有繼承的情況存在;在繼承中必須要有方法覆蓋;必須由基類的引用指向派生類的實例,並且通過基類的引用調用被覆蓋的方法;由上述條件可以看出,繼承是實現動態多態的首要前提。

相關焦點

  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。於是我們同樣創建的動物的對象,同樣調用這個動物對象叫的方法,如果這個動物對象是貓,則會發出「喵喵」聲,而如果這個動物對象是狗,發出的聲音則成了「汪汪」。這就是不同之類之間體現出來的多態。在代碼上體現就是方法名稱,參數,返回值完全與父類相同,而不同的子類在方法體內的代碼邏輯不同。
  • Java面向對象之:封裝、繼承、多態
    Java面向對象之:封裝、繼承、多態高內聚和低耦合,父類只希望被子類訪問的欄位和方法時;繼承從面向對象的角度上說,繼承是一種從一般到特殊的關係,是一種「is a」的關係,即子類是對父類的拓展,是一種特殊的父類,比如:狗是動物的一種特殊情況,狗屬於動物;在這個例子中,動物是父類,狗是子類,狗繼承了動物的特徵和行為,並在動物的特徵和行為的基礎之上拓展自己的特徵和行為
  • 面向對象特性之三:多態(Python進階教程)
    今天我們要講一講面向對象的第三個特性:多態;什麼叫做多態?從字面意思上理解,就是一個函數具有多種形態。本質上其實就是同一操作方法作用於不同的對象時,有著不同的解釋,執行不同的邏輯,產生不同的結果。今天我們還是用例子來說明在Python中多態的使用方法、注意事項和使用的優點。
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    各位讀者老爺們大家好鴨~圖圖又來了,今天我們要說一下「多態」。怎麼理解這兩個字呢?可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。
  • 深入分析java中的多態(從jvm角度分析)
    對於java中多態概念的理解一直是面試常問的問題,所以今天花了一些時間好好地整理了一下,力求從java虛擬機的角度來分析和理解多態。一、認識多態1、方法調用在Java中,方法調用有兩類,動態方法調用與靜態方法調用。
  • Java面向對象之接口——interface
    Java面向對象之接口——interface什麼是接口一般計算機中的接口分為對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實現細節;在面向對象的思想中,可認為他們都是同一個類的不同實例,也就是說插槽是USB規範的實例。
  • Python零基礎入門教程,面向對象有哪三大特性?
    大綱(面向對象的三大特性)封裝性繼承性多態性封裝性封裝隱藏了對象的屬性和方法內部實現細節,僅對外提供公共訪問方式,類的內部可以訪問,外部不可以訪問。私有變量和私有方法演示外部訪問私有變量或者私有方法報錯繼承性現實生活中狗與動物之間的關係
  • Java基礎知識學習:Java三大特效之多態!
    1.1 多態的形式多態是繼封裝、繼承之後,面向對象的第三大特性。多態是出現在繼承或者實現關係中的。Cat繼承了Animal,Cat對象也是Animal類型,自然可以賦值給父類類型的變量。1.2 多態的案例演示當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫後方法。如果子類沒有重寫該方法,就會調用父類的該方法。
  • Java基礎之多態,動態綁定多態的代碼案例,簡單卻很重要
    持續更新中...一、多態多態基於繼承(),現實事物中經常可以看到人,而學生、工人、白領、太空人等都是人,即由人演變而來的多種狀態。多態是Java三大特性(封裝、繼承、多態)之一,它的出現豐富了完善了Java面向對象體系。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • 跟我學java編程—面向對象編程多態概念的理解
    例1:在父類的基礎上增加新的行為在『深入了解面向對象的繼承思想』一節中,給出了一個案例,案例內容及案例代碼參見『深入了解面向對象的繼承思想』一節。其實,還有一種解決方案,在EBook類中重寫父類的outProduct(),這樣當EBook對象調用outProduct()方法時,其父類的outProduct()方法被忽略,而執行EBook類的outProduct()方法。代碼如下:例2給出的子類重寫父類的方法,就是面向對象的多態概念。
  • Java面向對象之final、abstract抽象、和變量生命周期
    Java面向對象之final、abstract抽象、final修飾符finalHello.java如果此時Hello.java文件中沒有使用package語句,表示在當前目錄中生成字節碼文件。運行時也不需要考慮包名。如果此時Hello.java文件中使用了package語句,此時表示在當前目錄中先生成包名目錄,再在包名目錄中生成字節碼文件。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • 用經典案例來幫助初學者解析Java的「多態」
    說到Java的「多態」特性,很多人都十分熟悉、了解;也有很多人仍然在理解或闡述時對此含糊不清。我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!
  • 必學——Java抽象類、接口、多態
    ,必須產生其子類,由子類創建對象。–實現類可以實現多個接口–接口中的變量都是靜態常量(4)、編碼實現3、多態:同一個引用類型,使用不同的實例而執行不同操作(1)使用多態實現思路>–編寫父類–編寫子類,子類重寫父類方法 –運行時,使用父類的類型,子類的對象(2)實現多態的兩種形式–使用父類或接口作為方法形參實現多態–使用父類或接口作為方法返回值實現多態
  • 「Java三分鐘」Java三大特性——多態理解
    多態顧名思義,指多種狀態。一個東西被人類創造,一定為了解決某種問題的,那麼多態存在是為了解決什麼問題呢?換言之,多態存在的意義是什麼?最後寫一個Main方法運行結果:小夥伴們可能都發現了,這樣設計程序有很大的問題,一兩本書可能沒差別,但以後可能會讀成千上萬本書,如果在Persion類中一直添加重載方法是非常可怕的。然而我們怎麼利用多態來解決這個問題呢?
  • 在.NET中,C#舉例深度理解面向對象編程中的封裝、繼承和多態
    -面向對象編程1.什麼是面向對象編程?我們在沒有接觸類之前,所有的代碼都是堆在一起的,沒有面向對象的概念,但接觸了類/對象/繼承/接口之後,我們要建立自己的面向對象編程的概念,在編碼過程中,要讓自己編寫的程序是面向對象的,而不是堆代碼。微軟在.NET框架中推出的C#語言是面向對象的強類型程式語言。
  • Java多態性:Java什麼是多態?
    多態性是面向對象編程的又一個重要特徵,它是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義
  • 黑馬程式設計師:Java學科-多態的定義格式以及向上、向下轉型
    理解多態的向上轉型理解多態的向下轉型一、多態1.概述引入:多態是繼封裝,繼承之後,面向對象的第三大特性多態體現的格式:父類類型:指子類對象繼承的父類類型,或者是實現父的接口類型代碼如下所示:當使用多態方法調用方法的時候,首先要檢查父類中是否有該方法,如果沒有這個方法,那麼編譯錯誤;如果有的話,執行的是子類重寫以後的方法。