覆寫(Overriding)是程式設計語言中非常流行的概念。Java中的方法覆寫是在超類和子類中存在相同方法的情況。它是在Java中實作運作時多态性的面向對象概念之一。
Java覆寫
下面來看看如何覆寫java中的方法。
public class BaseClass {
public void doSomething(String str){
System.out.println("Base impl:"+str);
}
}
下面,我們将建立一個子類,重寫BaseClass類中的doSomething方法。
public class ChildClass extends BaseClass{
public void doSomething(String str){
System.out.println("Child impl:"+str);
}
}
建立一個測試類來看看java中的重寫是如何工作的。
public class OverrideTest {
public static void main(String[] args) {
BaseClass bc = new ChildClass();
bc.doSomething("Via Yiibai");
}
}
執行上面示例代碼,得到以下結果 -
Child impl: Via Yiibai
2. Java重寫是如何工作的?方法簽名在超類和子類中必須完全相同。
建立執行個體時,必須使用子類構造函數。
在編譯時,變量引用超類。但是在運作時,它引用子類對象。
在變量上調用該方法時,看起來将調用超類方法。但是該方法存在于子類對象中,是以它被調用。
這裡bc的類型是BaseClass,但在運作時,它是ChildClass的對象。是以,當調用doSomething(String str)方法時,它會在ChildClass中查找方法,進而查找輸出。
Java重寫是否可以使用不同的方法簽名?
下面改變BaseClass類中的doSomething方法。
//Change argument from String to Object
public void doSomething(Object str){
System.out.println("Base impl:"+str);
}
編譯器不會抛出任何警告/錯誤,現在如果運作測試程式輸出将是 -
Base impl:Via Yiibai
原因是ChildClass不再覆寫BaseClass類的doSomething(Object str)方法。是以它調用了BaseClass實作。在這種情況下,ChildClass重載了doSomething()方法,因為方法名稱相同但方法簽名不同。
3. Java @Override注解
Java 1.5引入了注解。Java
如果取消注釋ChildClass中的
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMxITMzUDMmNmM3UWZzITO1E2N5QmY2ITZ2YzMjFmYy8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Java @Override注解的優點
Java
覆寫與重載的差別
編号
覆寫
重載
1
覆寫發生在超類和子類之間
重載存在于同一個類中
2
方法簽名在超類和子類中必須相同。
方法名稱必須相同,但方法簽名必須不同。
3
調用方法的辨別在運作時發生
可以辨別方法在編譯時調用。
4
如果重寫中斷,它可能會産生負面影響,因為程式将編譯并運作。但是,将調用來自超類的方法而不是子類。
如果更改方法名稱以中斷重載,則錯誤将在編譯時發生。是以它很容易修複并且不會造成太大的傷害。
5
覆寫也稱為運作時多态。
重載稱為編譯時多态。
¥ 我要打賞
糾錯/補充
收藏
加QQ群啦,易百教程官方技術學習群
注意:建議每個人選自己的技術方向加群,同一個QQ最多限加 3 個群。