Java继承与多态:从理解概念到实践应用的设计思维

作者:袖梨 2026-06-01

掌握Java继承与多态机制是面向对象编程的关键。不同于JavaScript的原型链继承,Java通过严格的树形结构和多态特性,大幅提升了代码的可扩展性。

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


1. 继承:单继承,严格层级

public class Dog extends Animal {
    public Dog(String name, int age, String breed) {
        super(name, age);  // 必须第一行
    }
}

Java采用单继承机制,有效规避了C++多继承可能引发的菱形问题。子类构造器中,super()调用必须置于第一行位置。

2. 方法重写:@Override 是保鲜

@Override
public void eat() {
    System.out.println(name + "在吃狗粮");
}

使用@Override注解能让编译器验证方法是否确实重写了父类方法。JavaScript缺乏此机制,容易出现拼写错误导致意外新增方法的问题。

3. 多态:父类引用,子类实现

Animal animal = new Dog("旺才", 3, "金毛");
animal.eat();  // 旺才在吃狗粮

多态特性表现为编译时检查左侧父类的方法声明,运行时执行右侧子类的具体实现。这是Java设计模式的重要基础。

4. 抽象类 vs 接口

场景用抽象类用接口
代码复用
多继承需求(多实现)
定义行为规范可以更适合

虽然JDK8为接口引入了默认方法,但本质区别依然存在:抽象类描述"是什么",接口定义"能做什么"。

5. 实战:员工工资系统

Employee.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(月薪员工):

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(时薪员工):

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(工资系统):

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("---");
        }
    }
}

设计亮点:

  1. 抽象类Employee统一定义了calculateSalary()接口
  2. SalariedEmployee和HourlyEmployee分别实现具体计算逻辑
  3. PayrollSystem通过多态统一处理各类员工

通过继承与多态的结合运用,Java实现了面向对象设计的开闭原则,使系统在保持稳定性的同时具备良好的扩展能力。

相关文章

精彩推荐