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

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

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

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

![](/files/-MPaFckydWAvotEamiZ6)

透過 [上一篇](/java-11/java-11-2.md#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 來呼叫特定的父類別建構元的話，\
程式編譯時將會出錯！

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://java.4-x.tw/java-11/java-11-3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
