在Java中,當子類繼承一個父類時,它可以重寫父類的方法或者重定義一個新方法。這兩種方法看起來很相似,但是它們有著不同的作用。
重寫是指子類創建一個與父類中同名、同參數列表的方法,并且需要保持返回類型和訪問修飾符相同。重寫方法的目的是為了更改父類所提供的實現或者添加子類特定的實現。子類的重寫方法將會覆蓋掉原有的父類方法,當調用該方法時,程序將會執行子類中的代碼。
public class Animal { public void eat() { System.out.println("Animal is eating"); } } public class Cat extends Animal { @Override public void eat() { System.out.println("Cat is eating"); } } public class Main { public static void main(String[] args) { Animal animal = new Animal(); Cat cat = new Cat(); animal.eat(); //<-- Output: Animal is eating cat.eat(); //<-- Output: Cat is eating } }
上述代碼展示了子類Cat重寫了父類Animal的eat()方法。當Animal對象調用eat()方法時,輸出的結果為“Animal is eating”,當Cat對象調用eat()方法時,輸出的結果為“Cat is eating”。
相比之下,重定義是指子類創建了一個與父類中同名、但是參數列表不同的方法。重定義方法的目的是為了添加一個全新的方法。這個方法會被子類調用,但是它不會覆蓋父類同名的方法。這種方法并不會涉及到父類中方法的重寫。
public class Dog extends Animal { public void eat(String food) { System.out.println("Dog is eating " + food); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); //<-- 輸出: Animal is eating dog.eat("meat"); //<-- 輸出: Dog is eating meat } }
在上述代碼中,子類Dog重定義了父類Animal的eat()方法,并且添加了一個String類型的參數。當子類對象調用eat()方法時,輸出的結果是“Animal is eating”,當調用eat("meat")方法時,輸出的結果是“Dog is eating meat”。
總的來說,Java中的重寫和重定義都是為了讓子類更加靈活地使用父類的方法。但是要注意它們的區別,以便在使用時不會出現不必要的錯誤。