Last active
July 3, 2024 04:00
-
-
Save HabaCo/a2c8ed62efc1b5d42a1c to your computer and use it in GitHub Desktop.
讓人頭痛的polymorphic(多型)、overriding(覆寫)、overloading(多載)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
polymorphism(多型)、overriding(覆寫)、overloading(多載) | |
// Superclass(父類別) | |
class Animal(){ | |
void sound(){ | |
} | |
} | |
// Subclass(子類別) | |
class Dog extends Animal{ | |
// 覆寫 Animal.sound() | |
void sound(){ | |
汪汪; | |
} | |
// 多載 Dog.sound() | |
void sound(int i){ | |
} | |
// 多載 Dog.sound() | |
void sound(String s, int i){ | |
} | |
} | |
// Subclass(子類別) | |
class Cat extends Animal{ | |
// 覆寫 Animal.sound() | |
void sound(){ | |
喵喵(); | |
} | |
} | |
// main | |
void main(){ | |
// 以父類建立具有子類方法的物件 | |
Animal dog = new Dog(); | |
Animal cat = new Cat(); | |
// 以子類建立具有父類方法的物件,執行產生錯誤(runtime error) | |
Dog d = (Dog)new Animal(); | |
.. | |
.. | |
dog.sound(); // 將會執行"汪汪(); | |
} | |
※polymorphism(多型):在main()裡dog、cat的宣告方式即稱為多型。 | |
須注意的是因Dog、Cat為繼承Animal的子類,所以Animal所有(default以上)的方法Dog、Cat類別都具有。 | |
但是Animal不能確保擁有Dog、Cat所擁有的方法,因此反過來宣告則會在執行時期產生錯誤。 | |
就以dog來說,dog雖是屬於Animal的物件,但是其中方法的部分只要Dog類別有覆寫,就會以Dog的為主。 | |
簡單來說,就是將Dog(子)類別所有覆寫(overriding)的方法複製貼上到Animal(父)類別的方法上並且宣告出dog物件。 | |
※overriding(覆寫):Dog類別和Cat類別皆是繼承Animal的子類別,在其中各自改寫了sound()的方法,此稱之。 | |
須注意的是【同型別】並且【同參數】才是覆寫,若【不同型別】卻【同參數】則會發生編譯錯誤 | |
※overloading(多載):在Dog類別裡有兩個sound()方法但參數不同,會在呼叫時依照給予的參數決定使用哪一個sound方法 | |
須注意的是【同型別】並且【不同參數】或【不同型別】並且【不同參數】才是多載 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment