详解 Java 基础的继承机制

一、什么是继承?

继承(Inheritance)是面向对象编程(OOP)的三大特性之一(封装、继承、多态),它允许一个类(子类/派生类)基于另一个类(父类/基类)的属性和方法进行扩展。通过继承,子类可以直接复用父类的功能,减少冗余代码,同时实现逻辑分层。


二、继承的核心语法
1. 基本语法
// 父类
class Animal {
    String name;
    public void eat() {
        System.out.println(name + "正在吃东西");
    }
}

// 子类继承父类
class Cat extends Animal {
    public void meow() {
        System.out.println(name + "喵喵叫");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "Tom";
        cat.eat();   // 继承自父类的方法
        cat.meow();  // 子类特有的方法
    }
}

输出结果

Tom正在吃东西  
Tom喵喵叫  
2. 继承的规则
  • Java 是单继承语言,一个类只能直接继承一个父类。
  • 所有类默认继承 Object 类(Java 的根类)。
  • 子类可以重写(Override)父类的方法(需满足方法签名一致)。

三、需求任务:实现员工管理系统

假设需要开发一个公司员工管理系统,包含以下需求:

  1. 基础功能:所有员工都有姓名、工号和基本工资。
  2. 分类管理:根据员工类型(普通员工、经理)计算工资:
    • 普通员工:基本工资 + 绩效奖金
    • 经理:基本工资 + 团队管理津贴
  3. 灵活扩展:未来可能新增其他员工类型(如技术专家)。

四、通过继承实现需求
任务 1:定义父类 Employee
class Employee {
    private String name;
    private String id;
    private double baseSalary;

    public Employee(String name, String id, double baseSalary) {
        this.name = name;
        this.id = id;
        this.baseSalary = baseSalary;
    }

    // 计算工资(默认实现)
    public double calculateSalary() {
        return baseSalary;
    }

    // 输出员工信息
    public void displayInfo() {
        System.out.println("姓名:" + name + ",工号:" + id);
    }
}
任务 2:定义子类 OrdinaryEmployeeManager
// 普通员工
class OrdinaryEmployee extends Employee {
    private double performanceBonus;

    public OrdinaryEmployee(String name, String id, double baseSalary, double performanceBonus) {
        super(name, id, baseSalary);  // 调用父类构造方法
        this.performanceBonus = performanceBonus;
    }

    @Override
    public double calculateSalary() {
        return super.calculateSalary() + performanceBonus;  // 基本工资 + 绩效
    }
}

// 经理
class Manager extends Employee {
    private double teamAllowance;

    public Manager(String name, String id, double baseSalary, double teamAllowance) {
        super(name, id, baseSalary);
        this.teamAllowance = teamAllowance;
    }

    @Override
    public double calculateSalary() {
        return super.calculateSalary() + teamAllowance;  // 基本工资 + 津贴
    }
}
任务 3:使用多态处理不同员工类型
public class Main {
    public static void main(String[] args) {
        Employee emp1 = new OrdinaryEmployee("张三", "E001", 8000, 2000);
        Employee emp2 = new Manager("李四", "M001", 15000, 5000);

        emp1.displayInfo();
        System.out.println("工资:" + emp1.calculateSalary());

        emp2.displayInfo();
        System.out.println("工资:" + emp2.calculateSalary());
    }
}

输出结果

姓名:张三,工号:E001  
工资:10000.0  
姓名:李四,工号:M001  
工资:20000.0  

五、继承中的关键机制
1. 方法重写(Override)
  • 子类重写父类方法时,使用 @Override 注解可提高可读性并防止拼写错误。
  • 重写规则:方法名、参数列表、返回类型必须与父类一致;访问权限不能更严格。
2. super 关键字
  • 用于调用父类的构造方法(必须放在子类构造方法的第一行)。
  • 用于访问父类被重写的方法或属性。
3. 构造方法的调用顺序

子类实例化时,默认先调用父类的无参构造方法。如果父类没有无参构造方法,必须显式调用 super(参数)


六、继承的注意事项
  1. 避免过度继承
    继承层级过深会导致代码难以维护。优先考虑组合(Composition)而非继承。

    // 组合示例:使用接口而非继承
    interface SalaryCalculator {
        double calculateSalary();
    }
    
  2. final 关键字

    • final class:禁止被继承(如 String 类)。
    • final method:禁止被子类重写。
  3. 继承 vs 接口

    • 继承:强调“是什么”(Is-A 关系,如“猫是动物”)。
    • 接口:强调“能做什么”(Has-A 能力,如“可飞行的”)。

七、实战扩展:新增技术专家类型

假设新增需求:技术专家(TechnicalExpert)的工资为基本工资 + 专利奖金。
只需新增一个子类,无需修改父类和其他子类:

class TechnicalExpert extends Employee {
    private double patentBonus;

    public TechnicalExpert(String name, String id, double baseSalary, double patentBonus) {
        super(name, id, baseSalary);
        this.patentBonus = patentBonus;
    }

    @Override
    public double calculateSalary() {
        return super.calculateSalary() + patentBonus;
    }
}

八、总结
  • 继承的核心价值:代码复用、逻辑分层、支持多态。
  • 适用场景:存在明显层级关系的类结构(如动物 → 猫/狗)。
  • 避免滥用:继承是强耦合关系,优先考虑组合或接口实现解耦。

通过本文的示例和需求任务,可以清晰理解继承在 Java 中的实际应用。合理使用继承,能让代码更简洁、更易扩展。

你可能感兴趣的:(java,开发语言)