Java是一種面向對象的編程語言,它支持兩種重要的概念:覆蓋和重寫。這兩個概念都涉及到對象的多態性,這是面向對象編程的核心思想之一。
覆蓋指的是一個派生類重寫了一個基類中的方法。在Java中,一個基類可以定義一些方法,而派生類可以根據需要重新實現(重寫)這些方法。這種行為被稱為覆蓋。重寫的方法與原始的基類方法具有相同的名稱和參數列表。派生類必須使用@Override注解來指示它正在覆蓋基類中的方法。
class Animal { public void move() { System.out.println("動物可以移動"); } } class Dog extends Animal { @Override public void move() { System.out.println("狗可以跑和走"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal Animal b = new Dog(); // Dog a.move(); // 執行 Animal 類的方法 b.move(); // 執行 Dog 類的方法 } }
在上面的例子中,類Animal和類Dog分別定義了一個方法move()。當一個Animal類型的對象調用這個方法時,會執行Animal類的move()方法,當一個Dog類型的對象調用這個方法時,會執行Dog類中重寫的move()方法。
重寫則是指在子類中對父類的方法進行修改。在Java中,重寫是即覆蓋又修改。對于一個重寫的方法來說,它必須與被重寫的方法有相同的名稱、參數列表和返回類型。這樣當程序執行時,就可以自動調用相應的方法。
class Fruit { public void eat() { System.out.println("水果是美味的!"); } } class Apple extends Fruit { @Override public void eat() { System.out.println("蘋果是美味的!"); } } public class TestFruit { public static void main(String[] args) { Fruit f = new Fruit(); // Fruit Fruit a = new Apple(); // Apple f.eat(); // 執行 Fruit 類的 eat 方法 a.eat(); // 執行 Apple 類的 eat 方法 } }
在上面的例子中,類Fruit和類Apple分別定義了一個方法eat()。當一個Fruit類型的對象調用這個方法時,會執行Fruit類的eat()方法,當一個Apple類型的對象調用這個方法時,會執行Apple類中重寫的eat()方法。
總的來說,覆蓋和重寫都是讓一個類在繼承另一個類的同時具有自己的行為方式。它們相似但又有細微的區別,理解并合理運用這兩個概念是成為一個好的Java程序員的關鍵之一。