###### 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());
}
}
```