# Overriding

改寫為 Java polymorphism 多型技術之一，同為多型技術技術的有之前提過的多載，\
讓我們先瞧瞧多載與改寫的比較。

> *多載 overloading：名稱相同，透過不同引數、型態，來呼叫相對應的函數。*
>
> *改寫 overriding：於子類別中，定義與父類別均相同的函數（名稱相同，引數個數相同）。*

讓我們先透過一簡單範例了解 改寫的意思以及其用法：\
透過上一篇 protected 的範例做本次範例

```
class CCircle              // 父類別 CCircle
{
   public CCircle(){}
   public void show()         // 父類別的 show() 函數
   {
      System.out.println("父類別的show()");
   }
}

class CCoin extends CCircle   // 子類別 CCoin
{
   public CCoin(){}
   public void show()         // 子類別的 show() 函數
   {
      System.out.println("子類別的show()");
   }
}

public class overriding
{
   public static void main(String args[])
   {
      CCoin coin=new CCoin();
      coin.show();         // 呼叫 show() 函數
   }
}
```

由此範例主要想表達的問題為：

於main() 呼叫show 函數時，是呼叫子類別中的show() 還是父類別中的show()

由程式執行的結果：子類別的show()

這種情況就是改寫 (overriding) ，子類別的show() 取代了父類別的show()

另外 也可以宣告父類別變數來存取子類別的物件：

```
CCoin coin=new CCoin();
```

將上述寫法 改成下方寫法：

```
CCircle coin=new CCoin();
```

在以上的成立的條件為：僅限於有「改寫」的情況發生下，才可以透過宣告父類別變數來存取子類別物件。

此時 改寫的好處就在這邊！如果有好幾個子類別繼承一個父類別，\
那麼僅需要建立一個子類別物件，並宣告父類別變數來存取之。

我們可以看一下以下程式的截圖：

![](https://2439647256-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4NDwp0sFRvD07cdujE%2F-MPaG2_GMikGFLQ5juFz%2F-MPaGCn9YfkEv6NH2exB%2Funnamed-file.jpg?alt=media\&token=afdf102c-7f86-48f4-a1ac-b4720672be04)

左邊為分別宣告子類別變數來指到建立的物件。\
右邊為宣告父類別變數來分別指向這些物件。

透過改寫的技術，可以讓程式碼更有一致性：\
（下方左程式碼）在呼叫area() 函數時必須一個一個去呼叫；\
但（下方右程式碼）只需要套一個迴圈，並可分別呼叫相對應的 area()函數。

![](https://2439647256-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4NDwp0sFRvD07cdujE%2F-MPaG2_GMikGFLQ5juFz%2F-MPaGFhNYiDPTYSjzMn1%2F2-1.png?alt=media\&token=fe619716-bdc7-42d5-9f83-cd1ba4d9f49f)
