員工與經理共享「姓名、工資、生日」等基礎屬性,但經理額外擁有「獎金」。利用繼承,Manager 僅需擴充獎金相關字段與方法,即可復用 Employee 的所有邏輯,避免代碼重複。
Employee (父類)
├── name: String
├── salary: double
├── birthday: Date
├── getter/setter
Manager (子類) extends Employee
├── bonus: double
├── getBonus()/setBonus()
import java.util.Date;
public class Employee {
private String name;
private double salary;
private Date birthday;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public double getSalary() { return salary; }
public void setSalary(double salary) { this.salary = salary; }
public Date getBirthday() { return birthday; }
public void setBirthday(Date birthday) { this.birthday = birthday; }
}
public class Manager extends Employee {
private double bonus;
public double getBonus() { return bonus; }
public void setBonus(double bonus) { this.bonus = bonus; }
}
import java.util.Date;
public class Test {
public static void main(String[] args) {
Employee emp = new Employee();
emp.setName("Java");
emp.setSalary(100);
emp.setBirthday(new Date());
Manager mgr = new Manager();
mgr.setName("明日科技");
mgr.setSalary(3000);
mgr.setBirthday(new Date());
mgr.setBonus(2000); // 子類特有屬性
System.out.println("員工姓名:" + emp.getName());
System.out.println("員工工資:" + emp.getSalary());
System.out.println("員工生日:" + emp.getBirthday());
System.out.println("經理姓名:" + mgr.getName());
System.out.println("經理工資:" + mgr.getSalary()); // 繼承自父類
System.out.println("經理生日:" + mgr.getBirthday()); // 繼承自父類
System.out.println("經理獎金:" + mgr.getBonus()); // 子類擴充
}
}
員工姓名:Java
員工工資:100.0
員工生日:Sat Jan 14 14:10:41 CST 2017
經理姓名:明日科技
經理工資:3000.0
經理生日:Sat Jan 14 14:10:41 CST 2017
經理獎金:2000.0
getSalary() 等父類方法直接可用,無需重寫。bonus,符合開閉原則。super(),父類先初始化(詳見 初始化順序)。class A { A() { System.out.println("A"); } }
class B extends A { B() { System.out.println("B"); } }
class C extends B { C() { System.out.println("C"); } }
new C(); // 輸出 A → B → C
記住口訣:父類靜態 → 子類靜態 → 父類實例/塊 → 父構造器 → 子類實例/塊 → 子構造器。