6.3 多态与接口
多态(polymorphism)是指同一个调用,在不同对象上可以表现出不同的行为。在 Java 中,常见做法是使用共同父类型或接口(interface)。如果多个类实现了同一个接口,调用方就可以使用接口类型,让每个对象执行自己的方法体。
同一个方法名,不同实现
下面两个类都实现了 Employee,因此它们都承诺提供 getName() 和 getSalary()。调用方只关心共同接口,不一定关心对象到底属于哪个类。
正在加载交互实验...
java
interface Employee {
String getName();
int getSalary();
}
class FullTimeEmployee implements Employee {
private String name;
private int basicSalary;
private int bonus;
FullTimeEmployee(String name, int basicSalary, int bonus) {
this.name = name;
this.basicSalary = basicSalary;
this.bonus = bonus;
}
public String getName() {
return name;
}
public int getSalary() {
return basicSalary + bonus;
}
}
class PartTimeEmployee implements Employee {
private String name;
private int hourlyWage;
private int hours;
PartTimeEmployee(String name, int hourlyWage, int hours) {
this.name = name;
this.hourlyWage = hourlyWage;
this.hours = hours;
}
public String getName() {
return name;
}
public int getSalary() {
return hourlyWage * hours;
}
}正在加载概念检查...
遍历不同对象
多态让我们可以把不同对象放进同一个数组,并用同一个方法调用处理它们。
java
Employee[] employees = {
new FullTimeEmployee("Alice", 5783, 173),
new PartTimeEmployee("Bob", 150, 15)
};
for (Employee employee : employees) {
System.out.println(employee.getName() + ":" + employee.getSalary() + "元");
}运行结果:
text
Alice:5956元
Bob:2250元循环里只写了 employee.getSalary(),但 Java 会根据对象真实所属的类执行对应逻辑。
正在加载概念检查...
什么时候不要强行使用继承
如果两个类只是“刚好都能做某件事”,但并不是同一种事物,就不一定要强行设计父类。在 Java 中,接口通常是更清晰的选择:接口描述对象能做什么,但不强行要求它们共享一套实现。
例如 Report、Invoice、GradeSheet 都可以实现一个 Exportable 接口。导出方法只需要调用 item.export(),不必知道每个对象内部如何生成内容。
java
interface Exportable {
String export();
}
static void exportAll(Exportable[] items) {
for (Exportable item : items) {
System.out.println(item.export());
}
}这种写法的好处是扩展性强。以后新增一个类,只要它也实现了 Exportable,就可以放进 exportAll()。
注意
在 Java 中,接口是“面向行为编程”的常见方式。调用方可以依赖
Employee 或 Exportable 这样的接口,而每个具体类决定方法内部到底怎么执行。正在加载概念检查...
正在加载本节练习...