# 類別繼承中的建構元呼叫

在上一篇提過執行子類別建構元之前，會先執行父類別的建構元。\
那麼如果父類別有多個建構元（不同引數個數），那該如何呼叫？

> 這時要用到 super( ) 來呼叫

讓我們先從流程圖先了解一下，再帶入範例：

![](https://2439647256-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4NDwp0sFRvD07cdujE%2F-MPaFVfX_O_oGH8jkImB%2F-MPaFckydWAvotEamiZ6%2Funnamed-file-7.png?alt=media\&token=c3d2d706-c170-44d6-978e-230533bab286)

透過 [上一篇](https://java.4-x.tw/java-11-2#fan-li-2) 的範例 2 來作本次建構元呼叫的範例：

```
class CCircle   //父類別CCircle
{
   private static double pi=3.14;
   private double radius;

   public CCircle()    // 無引數建構元
   {
      System.out.println("CCircle() 被呼叫");
   }
   public CCircle(double r)   // 一個引數的建構元
   {
      System.out.println("CCircle(double r) 被呼叫");
   }
}
class CCoin extends CCircle  // 子類別CCoin
{
   private int value;
   public CCoin()      // 無引數的建構元
   {
      System.out.println("CCoin() 被呼叫");
   }
   public CCoin(double r, int v) // 兩個引數的建構元
   {
      super(r);   // 呼叫父類別有一個引數的建構元
      System.out.println("CCoin(double r, int v) 被呼叫");
   }
}
public class class03
{
   public static void main(String args[])
   {
      CCoin coin1=new CCoin();         // 建立物件 coin1
      CCoin coin2=new CCoin(2,10);   // 建立物件 coin2
   }
}
```

main() 中，建立第一個物件 coin1 時：

會在呼叫子類別 無引數的建構元之前，先呼叫父類別無引數的建構元；\
因此程式執行結果會是

```
CCircle() 被呼叫
CCoin() 被呼叫
```

而main() 中，建立第二個物件 coin2 時：

這次給了(2,10) 的值，因此會呼叫子類別有兩個引數的建構元；\
而 CCoin(double r, int v) 此建構元當中，運用了本次要使用的 super() 敘述

這時 父類別中的建構元（一個引數）會先執行

```
public CCircle(double r)   // 一個引數的建構元
   {
      System.out.println("CCircle(double r) 被呼叫");
      radius=r;
   }
```

執行完父類別有引數的建構元後，才會執行CCoin(double r, int v) 此建構元 super() 之後的敘述。

因此程式執行結果為

```
CCircle(double r) 被呼叫
CCoin(double r, int v) 被呼叫
```

* 在本次範例中，如果子類別的建構元沒有寫上 super()，也是會執行父類別中「沒有引數的建構元」。
* super() 必須寫在建構元中的第一行敘述。
* super() 也有多載的技術：\
  會依照super括號中的引數個數去對應父類別建構元引數的個數。

## 注意

若父類別只有「有引數的建構元」，而子類別又沒透過 super 來呼叫特定的父類別建構元的話，\
程式編譯時將會出錯！

因為無法找到父類別「沒有引數的建構元」。
