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

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

相关推荐
Python私教9 分钟前
Django 6.1 RC1 实测:FETCH_PEERS 两条 SQL 解决 N+1,select_related 还需要吗?
后端·python·django
大侠在此在在此16 分钟前
教你用最简单的数学自底向上地高效学习SQL注入
后端
冰心孤城22 分钟前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
自强的小白22 分钟前
maven高级(聚合和私服)以及私服的上传和下载
java·maven
Python私教26 分钟前
Django 6.0 自带 Tasks 到底能不能替代 Celery?跑完 3 组后台任务后我有答案了
后端·python·django
唐青枫27 分钟前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java
看昭奚恤哭1 小时前
ontainer App】Container App无法从Container Registries 拉取镜像 - 报错 Forbidden
后端·python·flask
ShiXZ2131 小时前
Java 8 Stream API 实用技巧详解:从入门到精通
java·开发语言
C++、Java和Python的菜鸟2 小时前
第9章 后端Web进阶(AOP)
java·开发语言·前端
东北赵四2 小时前
关于Java泛型的知识点及其相关面试题
java·windows·python