---
# System prepended metadata

title: 9/28 寫個建構子?
tags: [JAVA]

---

###### tags: `JAVA`

# 9/28 寫個建構子?
## 這是題目

* 其它類別『不能修改』empno、name、salary
* 僅能在new Employee 時於建構方法中設定　empno、name、salary
* 建立物件後可以利用getXXX取得 empno、name、salary

* 設計一個Manager類別（繼承Employee類別）
* 加個long型態的bonus(分紅)，且不開放修改
* 同樣只能由建構方式中指定

* 設計一個建構方法可以同時指定empno、name、salary、bonus且要呼叫父類別的建構方法

* 覆寫getSalary，薪資為原本的salary加上bonus
```
public class Employee {
    private int empno;
    private String name;
    private long salary;
```

## 寫了3支個class(Employee、Manager、InfoBuilder)
### Employee
```
package exam.e4;

public class Employee {
	//設3個private不讓其他類別修改
    private int empno;
    private String name;
    private long salary;
 
 //====以上是題目提供的======
   
    
    //建構子
    public Employee(int empno,String name,long salary) {
    		this.empno=empno;
    		this.name=name;
    		this.salary=salary;
    }	 
    
    //設get方法讓人取得private的屬性們
    //當然沒設修改用的set方法
    //Alt+Shift+S   R
    
	public int getEmpno() {
		return empno;
	}
	
	public String getName() {
		return name;
	}
	
	public long getSalary() {
		return salary;
	} 
}

```
### Manager
```
package exam.e4;
//Manager繼承Employee
public class Manager extends Employee{
	//多加一個private且long型態的bonus
	private long bonus;
	
	//可同時輸入4參數的建構子
    public Manager(int empno,String name,long salary,long bonus) {
    	//private不給用this.的屬性及方法
    	//所以用super產生子類別物件
    	//子建構子呼叫父類別建構子
    	super(empno, name, salary);
    	//Manager的bonus自己加
    	this.bonus=bonus;
    }	 
	@Override
	//覆寫getSalary
	public long getSalary() {
		//用super讓子類別呼叫覆類別的方法，依題目需要加上分紅
		return super.getSalary()+bonus;
	}
    
	//多寫個顯示分紅多少
	public long getBonus() {
		return bonus;
	}
}

```


### InfoBuilder
```
package exam.e4;

public class InfoBuilder {

	public static void main(String[] args) {
		//3個參數修飾子皆設為private
		//建構後僅可用get方法取得
		Employee emp= new Employee(1,"小明",123L);
		System.out.printf(
				"員工編號:%d , 姓名:%s , 薪資:%d%n",
				emp.getEmpno(),emp.getName(),emp.getSalary());
		
		//
		Manager man= new Manager(2,"大美",234L,321L);
		System.out.printf(
			"主管編號:%d , 姓名:%s , 薪資:%d  (其中%d為分紅)%n",
			//class Manager的getSalary已Override為底薪加分紅
			man.getEmpno(),man.getName(),man.getSalary(),man.getBonus());

	}

}

```
