# 2019/0514/Java\_靜態類別+繼承特性

\#Java類別&物件

### ##Static 類別成員&#xD;

呼叫 ex: Math.PI

不能存取非Static類別成員

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqxgLVJ9xIss1xVFsG%2Fimage.png?alt=media\&token=74c07ad6-6904-44c5-b165-fbef895c11d3)

This這個參照是屬於動態方法 new 初始化物件 所以 static無法使用 static 屬於編譯時就存在了 new則是new之後才存在

#### ###目的&#xD;

展示動態物件內靜態屬性值

靜態方法只能讀取靜態參數值

動態靜態無法互相呼叫參照

使用靜態方法方式

動態方法new完後應該靜態參數就可以存取

但還是會報錯應該要在 static方法內存取

#### ### EmployeeS&#xD;

```
package com.example.java;

public class EmployeeS {

	private static int count = 0; // number of Employees created

	private String firstName;
	private String lastName;
	public Date birthDate;
	public Date hireDate;

	public EmployeeS(String firstName, String lastName,Date birthDate, Date hireDate) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.birthDate = birthDate;
		this.hireDate = hireDate;

		++count;
		System.out.printf("EmployeeS 物件建立成功 : %s %s; EmployeeS物件數量 = %d%n", firstName, lastName, count);
	}

	public String getFirstName() {
		String strTemp = String.valueOf(this.count);
		return firstName+strTemp;
	}

	public String getLastName() {
		return lastName;
	}

	public static int getCount() {
//		String s1= firstName;
//		String s2;
//		s2 = getFirstName();
		return count;
	}

	public String toString() {
		return String.format("%s,%s-雇用日期: %s-出生日期: %s", lastName, firstName, hireDate, birthDate);
	}

}

```

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqy21icJ9rfKUhJLRn%2Fimage.png?alt=media\&token=6531a8e1-fd00-4147-b23b-c142a415a140)

#### ### EmployeeSTest

```
package com.example.java;

public class EmployeeSTest {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub

		System.out.printf("新增員工前， EmployeeS物件數量: %d%n", EmployeeS.getCount());

		Date birth = new Date(7, 24, 2005);
		Date hire = new Date(3, 12, 2016);
		EmployeeS e1 = new EmployeeS("李", "連杰", birth, hire);
		EmployeeS e2 = new EmployeeS("甄", "子丹", birth, hire);

		System.out.printf("%n新增員工後， EmployeeS物件數量:%n");
		System.out.printf("呼叫  EmployeeS.getCount(): %d%n", EmployeeS.getCount());

		System.out.printf("%n員工 1: %s %s%n員工2: %s %s%n", e1.getFirstName(), e1.getLastName(), e2.getFirstName(),
				e2.getLastName());

		System.out.println(e1);
	}

}

```

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqyBSE3wM7r2EJBy5y%2Fimage.png?alt=media\&token=fa9d1fce-e965-4607-83f2-f59a18c824f2)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqyDxCG-Swm7ZLDHUh%2Fimage.png?alt=media\&token=bfa6c0fc-d821-4130-b97b-062a08bace83)

### ##靜態類別匯入&#xD;

Import 在 c#就是using

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqyNsenzk8kUPcC9Wm%2Fimage.png?alt=media\&token=28b00342-6601-493b-a1d6-a28f6e0f5a6b)

#### ### StaticImportTest.java

```
package com.example.java;

import static java.lang.Math.*;
//import static java.lang.Math.sqrt;
//import static java.lang.Math.ceil;

public class StaticImportTest {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub
		
	      System.out.printf("呼叫 Math.sqrt,sqrt(900.0) = %.1f%n", sqrt(900.0));
	      System.out.printf("呼叫 Math.ceil,ceil(-9.8) = %.1f%n", ceil(-9.8));
	      System.out.printf("呼叫 Math.E,E = %f%n",  java.lang.Math.E);
	      System.out.printf("呼叫 Math.PI,PI = %f%n", java.lang.Math.PI);

	}

}

```

## #繼承

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqy_ryFVikvTbuts25%2Fimage.png?alt=media\&token=baa8f779-3fc3-419d-a611-1a17cd031448)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqyfYG4ip59BJF0MCj%2Fimage.png?alt=media\&token=dadc3603-e364-4159-90e5-0100cb75f671)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqyvyelsfxfuDp4C_x%2Fimage.png?alt=media\&token=0dc38df6-c920-479e-bd26-9db2fde20765)

#### ##特殊化specialization&#xD;

### ##直接間接父類別

#### ##直接間接父類別direct superclass 上層(一代 (其實有祖類別&#xD;

#### ##間接父類別 indirect superclass &#xD;

#### java元祖類別為 object &#xD;

#### Java只支援單一繼承 跟c++不一樣 sigle inheritance&#xD;

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqz6Fc9GRjqxlSqE3H%2Fimage.png?alt=media\&token=7105cb80-fcc5-4d00-b7c9-f4fe8d2188be)

#### &#xD;

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqzEPlDkhda9tVYub0%2Fimage.png?alt=media\&token=5181e2ec-668e-4b27-a2d7-2a99c4094088)

### ##類別在使用上有兩種狀態&#xD;

Is a relationship

#### ###繼承&#xD;

Has a relationship

#### ###複合&#xD;

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqzKpS5WyJbImAVJKT%2Fimage.png?alt=media\&token=74823042-a2d9-4e2b-893c-b3f040deab1a)

越子代特徵會越明顯越清楚跟界門綱目科屬種很像

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqzPawZB9FSHQUdJgI%2Fimage.png?alt=media\&token=182ae07e-1699-4f86-9b63-d641b7e58690)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqzRrw-2QP04Jx93tf%2Fimage.png?alt=media\&token=94902e20-535c-4c83-85ac-b7c69b28ef42)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqzc_65ziY0Js4fULg%2Fimage.png?alt=media\&token=9c4804fb-c696-4221-8ba4-46f66d05bb51)

### ##向上轉型&#xD;

一般化往上移 ( 通用

特性化往下移

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqzi-cnSL7EpEJJidS%2Fimage.png?alt=media\&token=099629f9-12b6-4465-a49b-96ca20f0fef1)

### ##繼承-存取權&#xD;

Private 必須要在同一個 class 裡面

Protected 要有繼承關係或同個packge

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-LeqzncAy7JgDCKuAx-A%2Fimage.png?alt=media\&token=515e2fca-cb43-45ff-81ed-e599c957e699)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Leqzsov1Q6qRiZo5lFE%2Fimage.png?alt=media\&token=71f3b3cc-a652-40a0-9121-52e45cf67e14)

#### ##Entends 繼承&#xD;

#### ###CommissionEmployee.java&#xD;

```
package com.example.java;

public class CommissionEmployee extends Object{
	
	   private final String firstName;                        
	   private final String lastName;                         
	   private final String idNumber;             
	   private double grossSales; 
	   private double commissionRate; // 佣金，抽庸的比例
	                                
	   public CommissionEmployee(String firstName, String lastName, String idNumber, double grossSales, double commissionRate)
	   {                                                                  
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("佣金比例必須 > 0.0 and < 1.0");

	      this.firstName = firstName;                                     
	      this.lastName = lastName;                                    
	      this.idNumber = idNumber;         
	      this.grossSales = grossSales;
	      this.commissionRate = commissionRate;
	   } 

	   public String getFirstName()
	   {
	      return firstName;
	   }

	   public String getLastName()
	   {
	      return lastName;
	   } 

	   public String getIdNumber()
	   {
	      return idNumber;
	   } 

	   public void setGrossSales(double grossSales)
	   {
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      this.grossSales = grossSales;
	   } 

	   public double getGrossSales()
	   {
	      return grossSales;
	   } 

	   public void setCommissionRate(double commissionRate)
	   {
	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("Commission rate must be > 0.0 and < 1.0");

	      this.commissionRate = commissionRate;
	   } 

	   public double getCommissionRate()
	   {
	      return commissionRate;
	   } 
	        
	   public double earnings()              
	   {                                     
	      return commissionRate * grossSales;
	   } 

	   @Override
	   public String toString()                                             
	   {                                                                    
	      return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f %n%s: %.2f" ,    
	         "領佣金的員工姓名", firstName, lastName,                    
	         "身分證字號", idNumber,                
	         "每周銷售金額", grossSales,                                     
	         "佣金比例", commissionRate,
	         "薪資",this.earnings());                           
	   } 

}

```

### ##在不夠熟悉時&#xD;通常是實作兩個子類別最後再把相同之處往上搬制做父類別&#xD;

操控CommissionEmployee類別鑄造物件並操控物件進行方法

但其實是準備跟Employee類別做一般化的父類別

#### ### CommissionEmployeeTest.java&#xD;

```
package com.example.java;

public class CommissionEmployeeTest {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub
		
		CommissionEmployee employee01 = new CommissionEmployee("劉", "德華", "A123456789", 10000, .06);
		CommissionEmployee employee02 = new CommissionEmployee("陳", "立農", "A123456789", 5000, .1);

		System.out.println("以下呼叫 Get Method 取回員工資料:");
		System.out.printf("%n%s %s%n", "姓:", employee01.getFirstName());
		System.out.printf("%s %s%n", "名:", employee01.getLastName());
		System.out.printf("%s %s%n", "身分證字號:", employee01.getIdNumber());
		System.out.printf("%s %.2f%n", "銷售金額:", employee01.getGrossSales());
		System.out.printf("%s %.2f%n", "佣金比例:", employee01.getCommissionRate());
		
		employee01.setGrossSales(15000);
		employee01.setCommissionRate(.65);

		System.out.printf("%n%s:%n%n%s%n", "更新員工資料後，呼叫 toString Method 取回員工資料:", employee01);
		System.out.printf("%n%s:%n%n%s%n", "第二位員工資料", employee02.toString());


		
	}

}

```

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-G34I4fFpvcc8OxB%2Fimage.png?alt=media\&token=9f1f0c77-b918-437a-bb95-839984bdb9a4)

### ##建構子不會被繼承

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-M_GhML68V1F-bQ1%2Fimage.png?alt=media\&token=43f9fff2-5e21-49dd-817f-0782dfd2490d)

### ##不標記@Override也會複寫但最好要加上去&#xD;

{% embed url="<https://matthung0807.blogspot.com/2018/02/java-overload.html>" %}

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-TJ9usOUWuldLk7N%2Fimage.png?alt=media\&token=373b81fa-dc67-476f-9a27-d2cb92356f99)

{% embed url="<https://docs.oracle.com/javase/7/docs/api/index.html>" %}

在實作一個子類別 不一樣的地方只有紅色的地方

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-_XmNSb3HarAWzeB%2Fimage.png?alt=media\&token=fbc1664e-38dd-4f17-912c-8b46302ad381)

#### ###BasePlusCommissionEmployee.java

#### ##減少重複程式碼

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-h9Z3Va_gbumWpoK%2Fimage.png?alt=media\&token=e3b3d1a7-a69a-430c-9988-76e257e07f93)

建構子 方法 程式碼幾乎一樣

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-lKg3nlOgt4XXwhu%2Fimage.png?alt=media\&token=dc762862-c6ef-40c6-8cc0-167bd7333633)

#### ##防止錯誤 ( 重點為第三點 維護困難

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-pk-aUHxwH-uWcHw%2Fimage.png?alt=media\&token=0e5fded3-6813-4b09-a4aa-58e862e46d64)

### ##繼承的使用&#xD;

設計繼承架構 從兩個都是繼承object轉成其中一個為父類別，

(BasePlusCommissionEmployee、CommissionEmployee

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler-wUl7v08x2v3lVbQ%2Fimage.png?alt=media\&token=eb098092-6cf4-498a-8eb8-25a3e229e5d4)

### #子類別呼叫父類別建構式

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler01v2g37sB8G7IESd%2Fimage.png?alt=media\&token=31b736c5-6ff3-46ee-ba6b-3aee3a795fb3)

### ##初始化new父輩實體變數(參數) super ， c#裡面是base&#xD;

{% embed url="<https://www.google.com/search?q=java+super+c%23&rlz=1C1GCEU_zh-TWTW835TW836&oq=java+super+c&aqs=chrome.3.69i57j0l5.7904j0j7&sourceid=chrome&ie=UTF-8>" %}

#### ###如果沒有寫參數就會自動呼叫沒有參數的版本&#xD;

#### ###super(參數, 參數, 參數…)     super(firstName, lastName, socialSecurityNumber, ◦ grossSales, commissionRate); &#xD;

#### ###Super呼叫方法也可以間接取到父輩的參數   super.getGrossSales&#xD;

#### ###或是把參數從私有改為保護或公有&#xD;

#### ###類別設計好了要在新增一個檔案test做測試&#xD;

#### ###熟了的話可以直接從規格書知道那些要寫在父類(一般化)別那些要寫在子(特殊化)，架構邏輯要清楚&#xD;

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0J3o_YoKCVXbj-oa%2Fimage.png?alt=media\&token=fd39791d-a392-45a0-9db9-a53b956b3d58)

#### ###CommissionEmployeeExtV1 ( 父類別 繼承實作&#xD;

```
package com.example.java;

public class CommissionEmployeeExtV1 extends Object{
	
	   private final String firstName;                        
	   private final String lastName;                         
	   private final String idNumber;             
	   private double grossSales; 
	   private double commissionRate; // 佣金，抽庸的比例
	                                
	   public CommissionEmployeeExtV1(String firstName, String lastName, String idNumber, double grossSales, double commissionRate)
	   {                                                                  
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("佣金比例必須 > 0.0 and < 1.0");

	      this.firstName = firstName;                                     
	      this.lastName = lastName;                                    
	      this.idNumber = idNumber;         
	      this.grossSales = grossSales;
	      this.commissionRate = commissionRate;
	   } 

	   public String getFirstName()
	   {
	      return firstName;
	   }

	   public String getLastName()
	   {
	      return lastName;
	   } 

	   public String getIdNumber()
	   {
	      return idNumber;
	   } 

	   public void setGrossSales(double grossSales)
	   {
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      this.grossSales = grossSales;
	   } 

	   public double getGrossSales()
	   {
	      return grossSales;
	   } 

	   public void setCommissionRate(double commissionRate)
	   {
	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("佣金比例必須 > 0.0 and < 1.0");

	      this.commissionRate = commissionRate;
	   } 

	   public double getCommissionRate()
	   {
	      return commissionRate;
	   } 
	        
	   public double earnings()              
	   {                                     
	      return commissionRate * grossSales;
	   } 

	   @Override
	   public String toString()                                             
	   {                                                                    
	      return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f %n%s: %.2f" ,    
	         "領佣金的員工姓名", firstName, lastName,                    
	         "身分證字號", idNumber,                
	         "每周銷售金額", grossSales,                                     
	         "佣金比例", commissionRate,
	         "薪資",this.earnings());                           
	   } 

}

```

#### ###BasePlusCommissionEmployeeExtV1 ( 子類別 繼承實作&#xD;

```
package com.example.java;

public class BasePlusCommissionEmployeeExtV1 extends CommissionEmployeeExtV1{
	
	   private double baseSalary; //底薪
	                                
	   public BasePlusCommissionEmployeeExtV1(String firstName, String lastName, String idNumber, double grossSales, double commissionRate,double baseSalary)
	   {                                                                  
	      super(firstName,lastName,idNumber,grossSales,commissionRate);
		   
	      if (baseSalary < 0.0)                      
	          throw new IllegalArgumentException("底薪金額必須 >= 0.0");       

	      this.baseSalary = baseSalary;
	   } 
   
	   public void setBaseSalary(double baseSalary)
	   {
	      if (baseSalary < 0.0)
	         throw new IllegalArgumentException("底薪金額必須 >= 0.0");

	      this.baseSalary = baseSalary;
	   } 

	   public double getBaseSalary()
	   {
	      return baseSalary;
	   } 
	        
	   @Override
	   public double earnings()              
	   {                                     
	      return baseSalary + (super.getCommissionRate() * super.getGrossSales());
	   } 

	   @Override
	   public String toString()                                             
	   {                                                                    
	      return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f %n%s: %.2f" ,    
	         "領佣金的員工姓名", super.getFirstName(),  super.getLastName(),                    
	         "身分證字號", super.getIdNumber(),                
	         "每周銷售金額", getGrossSales(),                                     
	         "佣金比例", getCommissionRate(),
	         "底薪金額", baseSalary);                           
	   } 

}

```

#### ### BasePlusCommissionEmployeeExtV1Test&#x20;

#### ( 現在這個階段都在做類別所以檔案內不會有print必須要用 test檔案內 類別的物件操控做顯示&#xD;

```
package com.example.java;

public class BasePlusCommissionEmployeeExtV1Test {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub
		
		BasePlusCommissionEmployeeExtV1 employee01 = new BasePlusCommissionEmployeeExtV1("劉", "德華", "A123456789", 10000, .06,1000);
		CommissionEmployeeExtV1 employee02 = new CommissionEmployeeExtV1("陳", "立農", "A123456789", 5000, .1);

		System.out.println("以下呼叫 Get Method 取回員工資料:");
		System.out.printf("%n%s %s%n", "姓:", employee01.getFirstName());
		System.out.printf("%s %s%n", "名:", employee01.getLastName());
		System.out.printf("%s %s%n", "身分證字號:", employee01.getIdNumber());
		System.out.printf("%s %.2f%n", "銷售金額:", employee01.getGrossSales());
		System.out.printf("%s %.2f%n", "佣金比例:", employee01.getCommissionRate());
		System.out.printf("%s %.2f%n", "底薪金額:", employee01.getBaseSalary());
		
		employee01.setGrossSales(15000);
		employee01.setCommissionRate(0.1);
		employee01.setBaseSalary(2000);

		System.out.printf("%n%s:%n%n%s%n", "更新員工資料後，呼叫 toString Method 取回員工資料:", employee01);
		System.out.printf("總薪資:"+String.valueOf(employee01.earnings()));

		System.out.println("\n\n領獎金員工資料:");
		System.out.printf("%n%s:%n%n%s%n", "呼叫 toString Method 取回員工資料:", employee02);
		
	}

}

```

### ##繼承重點&#xD;

經過一系列以上的操作可以看到繼承後的程式碼少了非常少 (重複的都在父類別了

而且修改只要改源頭不需要一個檔案一個檔案改

接著 V2版本

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0Pgb_FnNPfgnlqlj%2Fimage.png?alt=media\&token=863a116d-11d5-49c4-bc87-112194ac74ef)

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0R_Jcdya4PZ_30oI%2Fimage.png?alt=media\&token=caa4dc0a-b39f-4e5a-b3bb-44135102371f)

保留封裝特性但同時又能存取父類別參數

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0Vieosa_mnZiZ6Ut%2Fimage.png?alt=media\&token=e8708655-8706-477b-a690-5ed3a5acfbb9)

孫代也更好的可以存取參數

### ##參數使用保護繼承的問題&#xD;

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0_0r_qAIEaPQDX-8%2Fimage.png?alt=media\&token=4f4620ee-701a-4d5f-8490-25c290ad80ce)

#### ###參數變成無效直沒經過驗證(因為驗證寫在父輩

![](https://1902678905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVJQfuBXyvHwCd1Nadk%2F-LeqxTZq4JAWWPrB6inP%2F-Ler0dEMXBcm2g3MySMv%2Fimage.png?alt=media\&token=28fd1c26-f5d4-4a24-8030-0464f10ae72a)

#### ###修改父類別的內容變成不會影響到子類別&#xD;

#### ###CommissionEmployeeExtV2&#xD;

```
package com.example.java;

public class CommissionEmployeeExtV2 extends Object{
	
	   protected final String firstName;                        
	   protected final String lastName;                         
	   protected final String idNumber;             
	   protected double grossSales; 
	   protected double commissionRate; // 佣金，抽庸的比例
	                                
	   public CommissionEmployeeExtV2(String firstName, String lastName, String idNumber, double grossSales, double commissionRate)
	   {                                                                  
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("佣金比例必須 > 0.0 and < 1.0");

	      this.firstName = firstName;                                     
	      this.lastName = lastName;                                    
	      this.idNumber = idNumber;         
	      this.grossSales = grossSales;
	      this.commissionRate = commissionRate;
	   } 

	   public String getFirstName()
	   {
	      return firstName;
	   }

	   public String getLastName()
	   {
	      return lastName;
	   } 

	   public String getIdNumber()
	   {
	      return idNumber;
	   } 

	   public void setGrossSales(double grossSales)
	   {
	      if (grossSales < 0.0) 
	         throw new IllegalArgumentException("銷售金額必須 >= 0.0");

	      this.grossSales = grossSales;
	   } 

	   public double getGrossSales()
	   {
	      return grossSales;
	   } 

	   public void setCommissionRate(double commissionRate)
	   {
	      if (commissionRate <= 0.0 || commissionRate >= 1.0)
	         throw new IllegalArgumentException("佣金比例必須 > 0.0 and < 1.0");

	      this.commissionRate = commissionRate;
	   } 

	   public double getCommissionRate()
	   {
	      return commissionRate;
	   } 
	        
	   public double earnings()              
	   {                                     
	      return commissionRate * grossSales;
	   } 

	   @Override
	   public String toString()                                             
	   {                                                                    
	      return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f %n%s: %.2f" ,    
	         "領佣金的員工姓名", firstName, lastName,                    
	         "身分證字號", idNumber,                
	         "每周銷售金額", grossSales,                                     
	         "佣金比例", commissionRate,
	         "薪資",this.earnings());                           
	   } 

}

```

#### ###BasePlusCommissionEmployeeExtV2&#xD;

```
package com.example.java;

public class BasePlusCommissionEmployeeExtV2 extends CommissionEmployeeExtV2 {

	protected double baseSalary; // 底薪

	public BasePlusCommissionEmployeeExtV2(String firstName, String lastName, String idNumber, double grossSales,double commissionRate, double baseSalary) {
		super(firstName, lastName, idNumber, grossSales, commissionRate);

		if (baseSalary < 0.0)
			throw new IllegalArgumentException("底薪金額必須 >= 0.0");

		this.baseSalary = baseSalary;
	}

	public void setBaseSalary(double baseSalary) {
		if (baseSalary < 0.0)
			throw new IllegalArgumentException("底薪金額必須 >= 0.0");

		this.baseSalary = baseSalary;
	}

	public double getBaseSalary() {
		return baseSalary;
	}

	@Override
	public double earnings() {
		grossSales = -5000.0;
		return baseSalary + (commissionRate * grossSales);
	}

	@Override
	public String toString() {
	      return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f %n%s: %.2f" ,    
	 	         "領佣金的員工姓名", firstName, lastName,                    
	 	         "身分證字號", idNumber,                
	 	         "每周銷售金額", grossSales,                                     
	 	         "佣金比例", commissionRate,
	 	         "底薪金額", baseSalary);
	}

}

```

#### ###BasePlusCommissionEmployeeExtV2Test&#xD;

```
package com.example.java;

public class BasePlusCommissionEmployeeExtV2Test {

	public static void main(String[] args) {
		// TODO 自動產生的方法 Stub
		
		BasePlusCommissionEmployeeExtV2 employee01 = new BasePlusCommissionEmployeeExtV2("劉", "德華", "A123456789", 10000, .06,1000);
		CommissionEmployeeExtV2 employee02 = new CommissionEmployeeExtV2("陳", "立農", "A123456789", 5000, .1);

		System.out.println("以下呼叫 Get Method 取回員工資料:");
		System.out.printf("%n%s %s%n", "姓:", employee01.getFirstName());
		System.out.printf("%s %s%n", "名:", employee01.getLastName());
		System.out.printf("%s %s%n", "身分證字號:", employee01.getIdNumber());
		System.out.printf("%s %.2f%n", "銷售金額:", employee01.getGrossSales());
		System.out.printf("%s %.2f%n", "佣金比例:", employee01.getCommissionRate());
		System.out.printf("%s %.2f%n", "底薪金額:", employee01.getBaseSalary());
		
		employee01.setGrossSales(15000);
		employee01.setCommissionRate(0.1);
		employee01.setBaseSalary(2000);

		System.out.printf("%n%s:%n%n%s%n", "更新員工資料後，呼叫 toString Method 取回員工資料:", employee01);
		System.out.printf("總薪資:"+String.valueOf(employee01.earnings()));

		System.out.println("\n\n領獎金員工資料:");
		System.out.printf("%n%s:%n%n%s%n", "呼叫 toString Method 取回員工資料:", employee02);
		
	}

}

```
