」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 什麼是多態性?探索 Java 中的型別-物件關係

什麼是多態性?探索 Java 中的型別-物件關係

發佈於2024-12-21
瀏覽:825

在學習Java的時候,遇到了多態的概念。我傾向於在深入實際使用之前掌握基本原理,因此我在這裡記錄了我的解釋。

我見過的多態性的常見解釋

多態的本義是「多元」。然而,在本文的上下文中,它指的是變數能夠保存不同類型的對象,只要透過類別繼承或介面實現存在關係,而不會導致錯誤。

典型類型匹配

一般來說,變數的型別與其所引用的物件的型別相符。

Animal animal = new Animal();

但是,當物件擴展類別時,變數可以被視為超類別的類型。

Animal animal = new Dog(); // Dog extends Animal

此外,如果一個物件實現了接口,則可以將其視為接口類型。

// Interface definition
interface Animal {
    void makeSound(); // Method in the interface
}

// Classes implementing the interface
class Dog implements Animal {
    public void makeSound() {
        System.out.println("Woof!"); // Dog-specific implementation
    }
}

class Cat implements Animal {
    public void makeSound() {
        System.out.println("Meow!"); // Cat-specific implementation
    }
}

// Main method
public class Main {
    public static void main(String[] args) {
        // Assign objects to variables of the interface type
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // Call the interface method
        myDog.makeSound(); // Outputs "Woof!"
        myCat.makeSound(); // Outputs "Meow!"
    }
}

這使我們能夠將不同的類別視為同一類型,從而實現靈活的編碼。

什麼是類型?

在討論變數的類型和物件的類型有何不同時,它提出了一個問題:「類型」到底是什麼?根據我的分析,我得出結論,類型有以下用途:

  • 聲明:指定儲存在記憶體區域中的資料類型。
  • 類型:指示如何使用儲存的資料。

參考前面的例子:

Animal animal = new Dog(); // Dog extends Animal

這意味著記憶體是為 Dog 分配的,但變數將內容解釋為 Animal。這個概念可以這樣形象化:

What Is Polymorphism? Exploring Type-Object Relations in Java

類型就像濾光鏡一樣,決定如何感知資料。透過改變視角,您可以專注於超類別中的公共方法或透過介面的特定方法。

為什麼不總是用超類別來聲明?

有人可能想知道,如果多態性的優點是處理跨類別的通用方法,為什麼我們不總是用超類別聲明變數。原因是在這種情況下,記憶體僅分配給超類別的資料。

What Is Polymorphism? Exploring Type-Object Relations in Java

雖然可以將子類別轉換為超類別(向上轉換),但反之則不然。這是因為子類別包含來自超類別的資料以及它自己的唯一資料。因此,記憶體是為子類別預先分配的,允許透過向上轉換來使用子類別特定的方法。

就介面而言

介面也作為類型,它們作為處理儲存在物件記憶體中的資料的濾鏡的角色在概念上類似於類別。透過介面呼叫的方法由物件的類型決定,而不是變數的類型(動態綁定)。這強化了這樣的想法:變數的類型僅充當過濾器,使我們能夠利用過濾後的資料。

結論

多態性在需要統一通用流程同時也需要利用個體特徵的場景中非常有用。透過我的探索,我更了解,雖然物件的記憶體佈局仍然由其類型決定,但變數的類型控制著記憶體的解釋方式,這對我來說是一個重要的認識。

版本聲明 本文轉載於:https://dev.to/yo-shi/what-is-polymorphism-exploring-type-and-object-relations-nmh?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 Python 中將秒轉換為小時、分鐘和秒?
    如何在 Python 中將秒轉換為小時、分鐘和秒?
    在Python 處理時間轉換:將秒轉換為小時、分鐘和秒的指南在程式設計中,通常需要處理各種格式的時間值。在處理秒數時,您可能需要將它們轉換為更具可讀性和組織性的格式,例如小時、分鐘和秒。 Python 為這個轉換提供了一個簡單且有效率的解決方案。 將秒轉換為小時、分鐘和秒將秒轉換為“小時:分鐘:秒”...
    程式設計 發佈於2024-12-21
  • 為什麼我的 PHP JSON POST 解碼失敗,如何修復?
    為什麼我的 PHP JSON POST 解碼失敗,如何修復?
    使用 PHP 解碼 JSON POST使用 PHP 解碼 JSON POST嘗試在支付介面網站上接收 JSON POST 時,解碼資料時出現意外結果。列印 $_POST 的內容時,會傳回一個空數組,表示缺少或無法解析的有效負載。 為了解決此問題,考慮了以下方法:迭代 $用於顯示鍵值對的 _POST ...
    程式設計 發佈於2024-12-21
  • 如何在 Python Unicode 中處理代理程式對?
    如何在 Python Unicode 中處理代理程式對?
    如何在Python Unicode 中處理代理對在Python 中,代理程式對用於表示基本多語言平面(BMP) 之外的Unicode 字元)。這些對由兩個代理項代碼點組成,用於對單一 Unicode 字元進行編碼。 使用包含代理程式對的 Python unicode 字串時,您可能會遇到與代理程式編...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • 如何調整 :hover 動畫以實現行動裝置互動?
    如何調整 :hover 動畫以實現行動裝置互動?
    調整:hover 動畫以實現移動設備交互您遇到了以下問題:展開面板的:hover CSS 動畫不會在移動設備上觸發設備由於沒有滑鼠懸停。為了解決這個問題,您的目標是在頁面寬度低於 700 像素時將觸發器切換為「點擊」或「觸控」。 要實現此目的,您可以結合使用 :hover 和 :active 選擇器...
    程式設計 發佈於2024-12-21
  • 如何使用 PHP 有效率地將 MySQL 查詢結果匯出到 CSV?
    如何使用 PHP 有效率地將 MySQL 查詢結果匯出到 CSV?
    在PHP 中將MySQL 查詢轉換為CSV在PHP 中,可以有效率地實作將MySQL 查詢資料匯出到CSV,而無需使用臨時文件文件。以下是完成此任務的兩種有效方法:使用MySQL 的SELECT ... INTO OUTFILE:該查詢直接將結果輸出到CSV 檔案中: SELECT * INTO O...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何解決 Go 中的「變數未使用」錯誤?
    如何解決 Go 中的「變數未使用」錯誤?
    Go 中變數未使用錯誤在給定的Go 程式碼中,發生編譯錯誤,因為宣告了變數「err」但仍然存在在“main”函數中未使用。這是 Go 中的一個常見問題,因為編譯器強制使用變數以避免程式碼中未使用的變數。 程式碼片段在“var”區塊中宣告了一個類型為 error 的變數“err”,但它是未在“main...
    程式設計 發佈於2024-12-21
  • 如何從 MySQL 有效率地檢索總計數和分頁結果?
    如何從 MySQL 有效率地檢索總計數和分頁結果?
    MySQL 分頁:高效檢索結果和總計數在MySQL 中實現分頁時,通常的做法是執行兩個單獨的查詢:一到取得結果總數,另一個限制取得的記錄。這種稱為雙重查詢的方法對於大型資料集可能效率低。 然而,問題是是否可以在單一查詢中檢索總結果計數並限制結果。雖然沒有直接的方法來實現此目的,但有兩種替代方法可用:...
    程式設計 發佈於2024-12-21
  • 如何透過 PHP 有效地使用 MySQL 中的預先準備語句?
    如何透過 PHP 有效地使用 MySQL 中的預先準備語句?
    MySQL 中的準備語句入門準備語句是編寫安全且有效率的 SQL 查詢的重要工具。在本文中,我們將探討如何在 PHP 中的 MySQLi 擴充 mysqli 中使用預先準備語句。 語法錯誤:非物件執行您遇到的錯誤、「致命錯誤:在非物件上呼叫成員函數execute()」通常表示$stmt 變量未正確初...
    程式設計 發佈於2024-12-21
  • 如何將 PNG 圖像直接嵌入到 HTML 中?
    如何將 PNG 圖像直接嵌入到 HTML 中?
    將PNG 映像直接整合到HTML 中將PNG 映像嵌入到HTML 中可以直接在瀏覽器中顯示,無需引用外部文件。為此,請利用 Base64 編碼技術:Base64 對 PNG 圖像進行編碼:使用線上編碼器將 PNG 圖像轉換為 Base64 字串。該字串表示文字格式的二進位圖像資料。 將Base64 ...
    程式設計 發佈於2024-12-21
  • 為什麼我在 JavaScript 表單提交中收到“‘submit’不是函數”錯誤?
    為什麼我在 JavaScript 表單提交中收到“‘submit’不是函數”錯誤?
    JavaScript 中的“Submit is not a function”錯誤錯誤訊息“'submit' is not a function”表示有問題嘗試使用JavaScript 提交表單時的程式碼。以下是根據提供的程式碼片段的解釋以及如何解決它:<form action...
    程式設計 發佈於2024-12-21
  • 如何使用 SqlDataReader 有效率地用多個相關表填入資料集?
    如何使用 SqlDataReader 有效率地用多個相關表填入資料集?
    使用SqlDataReader 用多個表填入DataSet當使用包含多個具有關係的表的DataSet 時,考慮如何有效地填入DataSet,同時維護資料完整性。雖然使用 DataReader 提供了一種輕量級方法,但在填入多個表格時可能會帶來挑戰。以下是一種改進的解決方案,它在處理一對多關係的同時利...
    程式設計 發佈於2024-12-21
  • 如何使用 C++ 以程式設計方式確定 Linux 伺服器的 IP 位址?
    如何使用 C++ 以程式設計方式確定 Linux 伺服器的 IP 位址?
    以C 語言程式設計確定Linux 伺服器IP 位址簡介識別Linux 伺服器的IP 位址對於網路通訊和應用程式部署至關重要。本文提出了一種用 C 編寫的程式設計解決方案,用於有效檢索 Linux 電腦的 IP 位址。 問題陳述目標是在 C 應用程式中以程式設計方式取得 Linux 伺服器的 IP 位...
    程式設計 發佈於2024-12-21
  • 如何處理多個介面中方法簽章衝突?
    如何處理多個介面中方法簽章衝突?
    如何在不同套件中實現具有相同方法簽名的多個介面假設您需要實現在不同套件中定義且方法簽名衝突的接口。這可能很有挑戰性,但 Go 提供了一個解決方案。 讓我們考慮一個例子:在包 A 中:package A type Doer interface { Do() string } func FuncA(...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3