继承(Inheritance)是面向对象编程(OOP)的三大特性之一(封装、继承、多态),它允许一个类(子类/派生类)基于另一个类(父类/基类)的属性和方法进行扩展。通过继承,子类可以直接复用父类的功能,减少冗余代码,同时实现逻辑分层。
// 父类
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喵喵叫
Object
类(Java 的根类)。假设需要开发一个公司员工管理系统,包含以下需求:
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);
}
}
OrdinaryEmployee
和 Manager
// 普通员工
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; // 基本工资 + 津贴
}
}
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
@Override
注解可提高可读性并防止拼写错误。super
关键字子类实例化时,默认先调用父类的无参构造方法。如果父类没有无参构造方法,必须显式调用 super(参数)
。
避免过度继承
继承层级过深会导致代码难以维护。优先考虑组合(Composition)而非继承。
// 组合示例:使用接口而非继承
interface SalaryCalculator {
double calculateSalary();
}
final
关键字
final class
:禁止被继承(如 String
类)。final method
:禁止被子类重写。继承 vs 接口
假设新增需求:技术专家(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 中的实际应用。合理使用继承,能让代码更简洁、更易扩展。