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

public class Dog extends Animal {
public Dog(String name, int age, String breed) {
super(name, age); // 必须第一行
}
}
Java采用单继承机制,有效规避了C++多继承可能引发的菱形问题。子类构造器中,super()调用必须置于第一行位置。
@Override
public void eat() {
System.out.println(name + "在吃狗粮");
}
使用@Override注解能让编译器验证方法是否确实重写了父类方法。JavaScript缺乏此机制,容易出现拼写错误导致意外新增方法的问题。
Animal animal = new Dog("旺才", 3, "金毛");
animal.eat(); // 旺才在吃狗粮
多态特性表现为编译时检查左侧父类的方法声明,运行时执行右侧子类的具体实现。这是Java设计模式的重要基础。
| 场景 | 用抽象类 | 用接口 |
|---|---|---|
| 代码复用 | ||
| 多继承需求 | (多实现) | |
| 定义行为规范 | 可以 | 更适合 |
虽然JDK8为接口引入了默认方法,但本质区别依然存在:抽象类描述"是什么",接口定义"能做什么"。
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("---");
}
}
}
设计亮点:
通过继承与多态的结合运用,Java实现了面向对象设计的开闭原则,使系统在保持稳定性的同时具备良好的扩展能力。