前言
学继承与多态。JS 的继承是原型链,灵活但混乱。Java 的继承是严格的树形结构,配合多态,代码扩展性极强。
1. 继承:单继承,严格层级
java
public class Dog extends Animal {
public Dog(String name, int age, String breed) {
super(name, age); // 必须第一行
}
}
Java 只支持单继承,避免了 C++ 多继承的菱形问题。super() 调用父类构造,必须放在第一行。
2. 方法重写:@Override 是保险
java
@Override
public void eat() {
System.out.println(name + "在吃狗粮");
}
@Override 注解让编译器检查是否真的在重写。JS 没有这机制,拼写错误变成新增方法,坑死人。
3. 多态:父类引用,子类实现
java
Animal animal = new Dog("旺财", 3, "金毛");
animal.eat(); // 旺财在吃狗粮
编译时看左边(Animal 有什么方法),运行时看右边(Dog 怎么实现)。这是 Java 的核心设计模式基础。
4. 抽象类 vs 接口
| 场景 | 用抽象类 | 用接口 |
|---|---|---|
| 代码复用 | ✅ | ❌ |
| 多继承需求 | ❌ | ✅(多实现) |
| 定义行为规范 | 可以 | 更适合 |
JDK 8 后接口有了默认方法,但核心区别仍在:抽象类是"是什么",接口是"能做什么"。
5. 实战:员工工资系统
Employee.java(员工抽象类):
java
public abstract class Employee {
protected String id;
protected String name;
public Employee(String id, String name) {
this.id = id;
this.name = name;
}
// 抽象方法:不同员工计算工资方式不同
public abstract double calculateSalary();
public void showInfo() {
System.out.println("工号:" + id + ",姓名:" + name);
}
}
SalariedEmployee.java(月薪员工):
java
public class SalariedEmployee extends Employee {
private double monthlySalary;
public SalariedEmployee(String id, String name, double monthlySalary) {
super(id, name);
this.monthlySalary = monthlySalary;
}
@Override
public double calculateSalary() {
return monthlySalary;
}
}
HourlyEmployee.java(时薪员工):
java
public class HourlyEmployee extends Employee {
private double hourlyRate;
private int hoursWorked;
public HourlyEmployee(String id, String name, double hourlyRate, int hoursWorked) {
super(id, name);
this.hourlyRate = hourlyRate;
this.hoursWorked = hoursWorked;
}
@Override
public double calculateSalary() {
return hourlyRate * hoursWorked;
}
}
PayrollSystem.java(工资系统):
java
public class PayrollSystem {
public static void main(String[] args) {
// 多态:父类引用指向不同子类对象
Employee[] employees = new Employee[3];
employees[0] = new SalariedEmployee("001", "张三", 15000);
employees[1] = new HourlyEmployee("002", "李四", 100, 160);
employees[2] = new SalariedEmployee("003", "王五", 20000);
System.out.println("=== 工资发放 ===");
for (Employee emp : employees) {
emp.showInfo();
System.out.println("本月工资:" + emp.calculateSalary() + "元");
System.out.println("---");
}
}
}
设计亮点:
Employee抽象类定义统一接口calculateSalary()SalariedEmployee和HourlyEmployee各自实现PayrollSystem用多态统一处理,新增员工类型无需修改
多态让代码"对扩展开放,对修改封闭"。新增一种员工,只需新增一个类,不用改工资计算逻辑。