Skip to content

Instantly share code, notes, and snippets.

@HabaCo
Last active July 3, 2024 04:00
Show Gist options
  • Save HabaCo/a2c8ed62efc1b5d42a1c to your computer and use it in GitHub Desktop.
Save HabaCo/a2c8ed62efc1b5d42a1c to your computer and use it in GitHub Desktop.
讓人頭痛的polymorphic(多型)、overriding(覆寫)、overloading(多載)
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