# 範例：類別的繼承

繼承可說是類別的精華，有程式碼再利用的概念。

> 繼承：可保有原先的程式碼，並加以擴增；再利用的程式碼可以重複使用。

每個類別只能有一個父類別，而父類別可擁有一個以上的子類別。

## 範例 1

類別的繼承以 extends 來將父類別繼承給子類別：以下為一簡單範例

```
class Caaa{ //父類別Caaa
	public int num1;
	public int num2;
        public void show(){
		System.out.println("num1="+num1);
		System.out.println("num2="+num2);
	}
}
class Cbbb extends Caaa{ //繼承父類別Caaa 的子類別Cbbb
	public void set_num(int a,int b){
		num1=a;
		num2=b;
	}
}
public class Class01 {

	public static void main(String[] args) {
		Cbbb bb=new Cbbb(); //利用子類別建立 bb物件
		bb.set_num(5, 10); //呼叫父類別中的函數
		bb.show();
	}
}
```

由此範例示範繼承來自父類別的資料成員 num1, num2 與show 函數，\
用來顯示num1, num2的值

因此可以見到：子類別繼承了父類別的public 成員，並使用自己的成員來設值使用。

## 範例 2

再一完整的範例來更加了解繼承的概念：

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

   public CCircle()     // CCircle建構元
   {
      System.out.println("CCircle() 被呼叫 ");
   }
   public void setRadius(double r)
   {
      radius=r;
      System.out.println("radius="+radius);
   }
   public void show()
   {
      System.out.println("area="+pi*radius*radius);
   }
}
class CCoin extends CCircle      // 繼承父類別CCircle 的子類別CCoin
{
   private int value;            // 子類別資料成員

   public CCoin()          // 子類別建構元
   {
      System.out.println("CCoin() 被呼叫 ");
   }
   public void setValue(int t)         // 子類別函數
   {
      value=t;
      System.out.println("value="+value);
   }
}
public class class02
{
   public static void main(String args[])
   {
      CCoin coin=new CCoin(); // 建立 coin 物件
      coin.setRadius(2.0);    // 呼叫父類別中的函數
      coin.show();         // 呼叫父類別中的函數
      coin.setValue(5);       // 呼叫子類別中的函數
   }
}
```

值得注意的是，這次父類別有 private 成員 以及建構元，這些是子類別無法直接繼承的。

private 成員部分： 必須透過父類別中的setRadius( ) , show( ) 函數才能在子類別存取到。

讓我們看到 main 中，建立 coin 物件時，看似呼叫子類別中的建構元；但在程式執行的結果卻發現 父類別的建構元會被先執行後，才輪到子類別的建構元。

其實這是 Java 繼承的機制，目的是來將繼承來自父類別的成員做初始化動作。

利用 coin 物件呼叫父類別繼承而來的兩個函數，\
最後利用 coin 物件呼叫子類別的函數。

## 整理

由此範例我們可以得知：

* 透過關鍵字 extends 繼承來自父類別的成員。
* 若父類別有private 成員，可透過繼承過來的函數做存取。
* 執行子類別之建構元之前，會先呼叫父類別之建構元，目的是為了初始化。


---

# 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-2.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.
