在Java中,子類可以重寫父類中的方法。這是面向對象編程的一個重要特性,它允許子類對父類中繼承的方法進行修改或擴展,從而實現更靈活的編程。
1. 什麼是方法重寫
方法重寫(也叫方法覆蓋)是指子類中定義與父類中同名、同參數、同返回值類型的方法,從而覆蓋(或替換)父類中的方法。當某個方法被子類重寫後,調用該方法時,將執行子類中的方法,而不再執行父類中的方法。
使用方法重寫,可以讓子類繼承父類中原有的行為,同時又可以根據子類自身的特性,修改或擴展父類中的方法,使其更符合子類自己的需求。
2. 方法重寫的要求
Java中方法重寫必須滿足以下要求:
- 方法名必須與父類中被重寫的方法名相同;
- 方法的參數類型、個數、順序都必須與被重寫的方法相同;
- 返回值類型也必須與被重寫的方法相同或者是它的子類;
- 訪問修飾符不能比父類中被重寫的方法的訪問修飾符更嚴格。
另外,如果父類中被重寫的方法是final或private類型的,則不能被子類重寫。
3. 方法重寫的示例
下面是一個簡單的例子,演示了如何在子類中重寫父類中的方法:
class Animal { public void makeSound() { System.out.println("動物發出聲音"); } } class Cat extends Animal { public void makeSound() { System.out.println("貓發出「喵喵」的聲音"); } } public class Main { public static void main(String[] args) { Animal animal = new Cat(); animal.makeSound(); // 輸出:貓發出「喵喵」的聲音 } }
上面的代碼中,Animal類是一個父類,定義了一個名為makeSound的方法;而Cat類繼承自Animal類,並覆蓋了makeSound方法,使其輸出「貓發出『喵喵』的聲音」。
在Main類中,我們實例化了一個Cat對象,並將其賦值給一個Animal引用,這樣就可以調用該對象的makeSound方法。由於Cat中重寫了makeSound方法,所以輸出的是「貓發出『喵喵』的聲音」,而不是Animal中的默認實現。
4. 方法重寫的注意事項
4.1 被重寫的方法不能為final類型
final修飾的方法是不能被子類重寫的。如果在子類中嘗試去重寫一個final方法,編譯器會報錯:
class Animal { public final void makeSound() {} } class Cat extends Animal { public void makeSound() {} // 編譯錯誤:makeSound() 無法覆蓋 Animal.makeSound();被覆蓋的方法為 final }
4.2 方法重寫不能改變訪問修飾符
方法重寫時,訪問修飾符不能比父類中被重寫的方法的訪問修飾符更嚴格。如果在子類中將父類中被重寫的方法聲明為private或protected類型,編譯器會報錯。但是,如果在子類中將父類中的public方法改為protected或private,不會報錯,但是也不能通過編譯。
class Animal { protected void makeSound() {} } class Cat extends Animal { private void makeSound() {} // 編譯錯誤:makeSound() in Cat cannot override makeSound() in Animal; attempting to assign weaker access privileges; was protected }
4.3 父類和子類里的方法參數要完全一樣
父類和子類中重寫的方法必須有相同的參數類型、參數個數和順序。如果不滿足這個條件,編譯器會報錯:
class Animal { public void makeSound(String sound) {} } class Cat extends Animal { public void makeSound(int sound) {} // 編譯錯誤:makeSound(int) in Cat cannot override makeSound(String) in Animal }
4.4 父類和子類里的方法返回類型要匹配
父類和子類中重寫的方法的返回類型必須相同,或者子類的返回類型必須是父類的返回類型的子類:
class Animal { public Number makeSound() {return 0;} } class Cat extends Animal { public Integer makeSound() {return 0;} // 編譯錯誤:makeSound() in Cat cannot override makeSound() in Animal; return type Integer is not compatible with Number }
上面的代碼中,Animal類中makeSound方法的返回類型是Number,而Cat類中重寫的makeSound方法的返回類型是Integer。這是不合法的,因為Integer雖然是Number的子類,但並不等價於Number。
4.5 方法重寫時要保證語義一致
在重寫父類的方法時,應該保證子類中的方法語義和父類中方法的語義一致。也就是說,重寫的方法不能改變原來方法的含義,否則容易出現程序錯誤。
例如:
class Animal { public void makeSound(int volume) {} } class Cat extends Animal { public void makeSound(int volume, String soundType) {} // 這種覆蓋是不一致的,編譯錯誤 }
上面的代碼中,Cat類中重寫makeSound方法時,添加了一個新的參數soundType,這會導致Cat類的makeSound方法和Animal類的makeSound方法語義不一致。所以編譯時會報錯。
5. 總結
Java中,方法重寫是子類繼承父類時的一種特性。它允許子類重寫父類中的方法,從而修改或擴展父類中原有的行為。但是,在編寫重寫方法時需要注意許多細節,包括方法名、訪問修飾符、參數類型和順序、返回類型等。只有遵守這些規則,才能實現正確的方法重寫。
原創文章,作者:LHDM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/132385.html