Java 继承与多态:从"是什么"到"能做什么"的设计思维

前言

学继承与多态。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()
  • SalariedEmployeeHourlyEmployee 各自实现
  • PayrollSystem 用多态统一处理,新增员工类型无需修改

多态让代码"对扩展开放,对修改封闭"。新增一种员工,只需新增一个类,不用改工资计算逻辑。

相关推荐
葫芦和十三1 小时前
图解 MongoDB 04|索引模型:每建一个索引,就是在 B+-tree 森林里多栽一棵
后端·mongodb·agent
用户47949283569152 小时前
claude Fable用不了?把Gpt 5.5pro接到你的claude code里
前端·后端
GetcharZp4 小时前
告别 Nginx 复杂配置!这款带 Web 面板的万能代理神器,让端口转发变得如此简单
后端
IT_陈寒7 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
nanxun8868 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
Pedantic8 小时前
SwiftUI 手势笔记
前端·后端
金銀銅鐵8 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
用户15630681035110 小时前
Day01 | Java 基础(Java SE)
java
飘尘10 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈