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 用多态统一处理,新增员工类型无需修改

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

相关推荐
SeaDhdhdhdhdh4 小时前
MCP Server 搭建与使用指南
java·ai·agent·mcp
YH55269844 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
AI_小站5 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
笃行3506 小时前
向量数据库单独建一套,这笔账划不划算
后端
许彰午6 小时前
03-三种开发模式
java·架构
涟漪海洋6 小时前
创建最新的JDK25镜像,非root环境启动
java
weixin_431600446 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
Rain的Java大神之路6 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
2602_959960927 小时前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题
Zane1994127 小时前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言