在學習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。這個概念可以這樣形象化:
類型就像濾光鏡一樣,決定如何感知資料。透過改變視角,您可以專注於超類別中的公共方法或透過介面的特定方法。
有人可能想知道,如果多態性的優點是處理跨類別的通用方法,為什麼我們不總是用超類別聲明變數。原因是在這種情況下,記憶體僅分配給超類別的資料。
雖然可以將子類別轉換為超類別(向上轉換),但反之則不然。這是因為子類別包含來自超類別的資料以及它自己的唯一資料。因此,記憶體是為子類別預先分配的,允許透過向上轉換來使用子類別特定的方法。
介面也作為類型,它們作為處理儲存在物件記憶體中的資料的濾鏡的角色在概念上類似於類別。透過介面呼叫的方法由物件的類型決定,而不是變數的類型(動態綁定)。這強化了這樣的想法:變數的類型僅充當過濾器,使我們能夠利用過濾後的資料。
多態性在需要統一通用流程同時也需要利用個體特徵的場景中非常有用。透過我的探索,我更了解,雖然物件的記憶體佈局仍然由其類型決定,但變數的類型控制著記憶體的解釋方式,這對我來說是一個重要的認識。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3