文章目錄
- 107. Java 繼承 - 總結:方法重寫與隱藏
- **詳細解釋:**
- **方法重載**
- **總結**
107. Java 繼承 - 總結:方法重寫與隱藏
在 Java 中,定義與超類中的方法具有相同簽名的方法時,不同類型的方法之間會有不同的行為。以下是一個總結表,幫助您更清晰地理解子類實例方法和靜態方法與超類方法的關系:
子類方法類型 | 超類實例方法 | 超類靜態方法 |
---|---|---|
子類實例方法 | 重寫(Overrides) | 生成編譯時錯誤 |
子類靜態方法 | 生成編譯時錯誤 | 隱藏(Hides) |
詳細解釋:
-
子類實例方法與超類實例方法
- 當子類中定義的方法與超類的實例方法具有相同的簽名(方法名、參數類型和數量、返回類型),子類會重寫(override)超類的方法。此時,調用子類的實例方法會使用子類的方法實現,而不再使用超類的方法。
示例:
class Animal {public void sound() {System.out.println("Animal sound");} }class Dog extends Animal {@Overridepublic void sound() {System.out.println("Bark");} }
在這個例子中,
Dog
類重寫了Animal
類的sound()
方法。調用Dog
的sound()
方法將輸出 “Bark”。 -
子類實例方法與超類靜態方法
- 編譯時錯誤:如果子類定義了一個與超類靜態方法具有相同簽名的方法,將會產生編譯時錯誤。因為靜態方法與實例方法不同,靜態方法是根據類來調用的,而實例方法是根據對象來調用的。
示例:
class Animal {public static void test() {System.out.println("Static method in Animal");} }class Dog extends Animal {// 編譯時錯誤:不能重寫靜態方法public void test() {System.out.println("Static method in Dog");} }
-
子類靜態方法與超類實例方法
- 編譯時錯誤:如果子類定義了一個與超類實例方法具有相同簽名的靜態方法,會產生編譯時錯誤。靜態方法不能訪問實例方法,因此不能與實例方法同名。
-
子類靜態方法與超類靜態方法
- 隱藏(Hides):當子類中定義的靜態方法與超類中的靜態方法具有相同簽名時,子類的方法將隱藏超類的靜態方法。此時,如果從子類調用該方法,將調用子類中的靜態方法,而不再調用超類中的靜態方法。
示例:
class Animal {public static void test() {System.out.println("Static method in Animal");} }class Dog extends Animal {public static void test() {System.out.println("Static method in Dog");} }public class Main {public static void main(String[] args) {Animal.test(); // 輸出: Static method in AnimalDog.test(); // 輸出: Static method in Dog} }
在這個例子中,
Dog
類隱藏了Animal
類的test()
靜態方法,因此調用Dog.test()
會輸出 “Static method in Dog”,而調用Animal.test()
會輸出 “Static method in Animal”。
方法重載
值得注意的是,在子類中,方法重載與方法重寫是不同的。重載是指在同一個類中,定義多個方法名稱相同但參數不同(包括類型、數量或順序)的多個方法。重載的的方法既不隱藏也不覆蓋超類的實例方法,而是視為新方法,對子類來說是唯一的。
示例:
class Animal {public void speak() {System.out.println("Animal speaks");}
}class Dog extends Animal {// 重載方法,不是覆蓋public void speak(int times) {System.out.println("Dog barks " + times + " times");}
}
在這個例子中,Dog
類中的 speak(int times)
方法是重載的方法,不會覆蓋超類中的 speak()
方法。Dog
類仍然保有父類的 speak()
方法,并且可以定義自己的重載方法。
總結
- 實例方法重寫:子類可以重寫超類的實例方法,覆蓋父類的實現。
- 靜態方法隱藏:子類可以隱藏超類的靜態方法,調用哪個版本的方法取決于對象的引用類型。
- 方法重載:子類可以重載超類的方法,重載的方法是新的,與超類實例方法無關。
通過理解這些基本規則,學員可以清晰地掌握方法重寫與靜態方法隱藏的概念,避免在多態和繼承中出現常見的錯誤。