Java多態性:Java什麼是多態?

2021-01-20 逆向開發

多態性是面向對象編程的又一個重要特徵,它是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義。

對面向對象來說,多態分為編譯時多態和運行時多態。其中編譯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的方法。通過編譯之後會變成兩個不同的方法,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是大家通常所說的多態性。

Java 實現多態有 3 個必要條件:繼承、重寫和向上轉型。只有滿足這 3 個條件,開發人員才能夠在同一個繼承結構中使用統一的邏輯實現代碼處理不同的對象,從而執行不同的行為。

例 1

下面通過一個例子來演示重寫如何實現多態性。例子使用了類的繼承和運行時多態機制,具體步驟如下。

1)創建 Figure 類,在該類中首先定義存儲二維對象的尺寸,然後定義有兩個參數的構造方法,最後添加 area() 方法,該方法計算對象的面積。代碼如下:

public class Figure {    double dim1;    double dim2;    Figure(double d1, double d2) {                this.dim1 = d1;        this.dim2 = d2;    }    double area() {                System.out.println("父類中計算對象面積的方法,沒有實際意義,需要在子類中重寫。");        return 0;    }}

2)創建繼承自 Figure 類的 Rectangle 子類,該類調用父類的構造方法,並且重寫父類中的 area() 方法。代碼如下:

public class Rectangle extends Figure {    Rectangle(double d1, double d2) {        super(d1, d2);    }    double area() {        System.out.println("長方形的面積:");        return super.dim1 * super.dim2;    }}

3)創建繼承自 Figure 類的 Triangle 子類,該類與 Rectangle 相似。代碼如下:

public class Triangle extends Figure {    Triangle(double d1, double d2) {        super(d1, d2);    }    double area() {        System.out.println("三角形的面積:");        return super.dim1 * super.dim2 / 2;    }}

4)創建 Test 測試類,在該類的 main() 方法中首先聲明 Figure 類的變量 figure,然後分別為 figure 變量指定不同的對象,並調用這些對象的 area() 方法。代碼如下:

public class Test {    public static void main(String[] args) {        Figure figure;         figure = new Rectangle(9, 9);        System.out.println(figure.area());        System.out.println("===============================");        figure = new Triangle(6, 8);        System.out.println(figure.area());        System.out.println("===============================");        figure = new Figure(10, 10);        System.out.println(figure.area());    }}

從上述代碼可以發現,無論 figure 變量的對象是 Rectangle 還是 Triangle,它們都是 Figure 類的子類,因此可以向上轉型為該類,從而實現多態。


5)執行上述代碼,輸出結果如下:

長方形的面積:
81.0
===============================
三角形的面積:
24.0
===============================
父類中計算對象面積的方法,沒有實際意義,需要在子類中重寫。
0.0


相關焦點

  • 詳細介紹Java多態性(二)
    多態性是通過:1 接口和實現接口並覆蓋接口中同一方法的幾不同的類體現的2 父類和繼承父類並覆蓋父類中同一方法的幾個不同子類實現的.一、基本概念多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。
  • 詳細介紹Java多態性(一)
    詳細介紹Java多態性(一) 本文介紹的是JAVA的多態性,希望對你有幫助,一起來看。下面介紹java的多態性。面向對象編程有三個特徵,即封裝、繼承和多態。封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。繼承是為了重用父類代碼,同時為實現多態性作準備。那麼什麼是多態呢?方法的重寫、重載與動態連接構成多態性。
  • 深入分析java中的多態(從jvm角度分析)
    對於java中多態概念的理解一直是面試常問的問題,所以今天花了一些時間好好地整理了一下,力求從java虛擬機的角度來分析和理解多態。一、認識多態1、方法調用在Java中,方法調用有兩類,動態方法調用與靜態方法調用。
  • 用經典案例來幫助初學者解析Java的「多態」
    說到Java的「多態」特性,很多人都十分熟悉、了解;也有很多人仍然在理解或闡述時對此含糊不清。我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!
  • JAVA面向對象的多態是個什麼東西?
    面向對象的三大特徵:封裝、繼承、多態。在前面已經說了過了封裝和繼承。今天就來聊聊剩下的多態。多態,從字面內容來看,就是多種形態,多種狀態。在java的面向對象中可以從以下兩個方面來講。01不同子類之間的多態在前面我們說繼承的時候說到,子類可以繼承到父類的方法,繼承後可以對方法進行重寫。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • Java-類型轉換,使用強制向下轉型解決多態的弊端
    瀏覽器版本過低,暫不支持視頻播放1.1.java的類型轉換1.1.1.java的類型轉換自動向上轉型: 可以直接將子類型引用賦值給父類型變量,可以自動進行,叫做自動向上轉型;例如:class Fu{}class Zi extends Fu{}
  • 必學——Java抽象類、接口、多態
    –接口不可以被實例化–實現類必須實現接口的所有方法–實現類可以實現多個接口–接口中的變量都是靜態常量(4)、編碼實現3、多態:同一個引用類型,使用不同的實例而執行不同操作(1)使用多態實現思路–編寫父類–編寫子類,子類重寫父類方法 –運行時,使用父類的類型,子類的對象(2)實現多態的兩種形式
  • Java多態性理解
    Java中多態性的實現什麼是多態面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最後一個概念,也是最重要的知識點。多態的定義:指允許不同類的對象對同一消息做出響應。
  • Java多態,對象轉型,和簡單工廠模式 希望對您有幫助!
    各位讀者老爺們大家好鴨~圖圖又來了,今天我們要說一下「多態」。怎麼理解這兩個字呢?可以理解為同一個引用對象的不同表現形態,即將父類的引用指向子類的對象。這是比較官方的書面解釋,大家可以通過自己的理解轉化成自己的話。知道,了解一下就行。大家還需要知道的是:多態是java面向對象的三大特徵之一。
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    對多態理解不夠深入的,多半都會答錯;如果能記住口訣:「變量多態看左邊,方法多態看右邊,靜態多態看左邊」的話,肯定就知道答案,但是JVM是如何確定具體調用哪個方法的,有小夥伴思考過嗎?Java中的非虛方法除了使用invokestatic、invokevirtual調用的方法之外還有一種,就是被final修飾的方法,雖然final方法是使用invokevirtual指令來調用的,但是由於它無法被覆蓋,沒有其他版本,所以也無須對方法接收者進行多態選擇,又或者說多態選擇的結果肯定是唯一的。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • Java 中的繼承和多態(深入版)
    面向對象的三大特性:封裝、繼承、多態。在這三個特性中,如果沒有封裝和繼承,也不會有多態。那麼多態實現的途徑和必要條件是什麼呢?以及多態中的重寫和重載在JVM中的表現是怎麼樣?在Java中是如何展現繼承的特性呢?對於子類繼承於父類時,又有什麼限制呢?
  • Thinking In Java --- 多態(筆記)
    在面向對象的程序設計語言中,多態是繼數據抽象和繼承之後的第三種基本特徵。多態通過分離做什麼和怎麼做,從另一個角度將接口和實現分離開來。多態不但能夠改善代碼的組織結構和可讀性,還能夠創建可擴展的程序----即無論在項目最初創建時還是在需要添加新功能時都可以「生長」的程序。
  • 多態是什麼 父類如何調用子類的方法(美團面試))
    面試官:什麼是多態呢?豬隊友:多種形態,氣體,液體,固體~面試官:go out! now!引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自「Delphi4 編程技術內幕」)。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。
  • Java面向對象之final、abstract抽象、和變量生命周期
    Hello.java如果此時Hello.java文件中沒有使用package語句,表示在當前目錄中生成字節碼文件。運行時也不需要考慮包名。如果此時Hello.java文件中使用了package語句,此時表示在當前目錄中先生成包名目錄,再在包名目錄中生成字節碼文件。
  • Java基礎教程:java反射機制教程
    現在出現一個問題,如果這個user類不是我們自己定義的,我們從外部看不到裡面有什麼東西,而且我們又想去知道內部長什麼樣,比如說有幾個欄位、方法、構造方法、共有還是私有的等等,這時候該怎麼辦呢?這時候java語言在設計的時候為我們提供了一個機制,就是反射機制,他能夠很方便的去解決我們的問題。
  • Java面向對象之:封裝、繼承、多態
    訪問權限修飾符應封裝的隱藏細節的理念,java提供了訪問權限修飾符來控制調用者的訪問權限,詳情如下:private:屬於類訪問權限,表示私有的,只能在當前類中訪問,使用private修飾的類、方法、欄位,在』離開當前類的作用域之後
  • 跟我學java編程—認識java語言的字符類型
    用記事本打開「CharSample.java」文件,輸入以下代碼:編譯「CharSample.java」文件,在命令行窗口輸入「javac CharSample.java」並執行命令,編譯通過後,在命令行窗口輸入「java CharSample」運行Java程序,命令行窗口顯示如下信息:
  • JAVA專業術語面試100問
    抽象、繼承、封裝、多態。2、接口和抽象類有什麼聯繫和區別?3、重載和重寫有什麼區別?4、java有哪些基本數據類型?5、數組有沒有length()方法?String有沒有length()方法?Error與Exception有什麼區別?17、java中的throw 和 throws關鍵字有什麼區別?18、列舉幾個你了解的幾個常見的運行時異常?19、final, finally, finalize有什麼區別?