
Java多态案例解析:代码重用与冗余消除
下载需积分: 10 | 49KB |
更新于2025-01-31
| 128 浏览量 | 举报
1
收藏
多态是面向对象编程的核心概念之一,它允许我们使用父类的引用来指向子类的对象,并通过这个引用来调用在子类中重写的方法。多态可以实现代码的重用,去除冗余代码,并且使程序更加灵活和可扩展。下面,我们将通过一个关于员工工资计算的经典案例,从四个不同层次对Java中的多态进行解析。
### 1. 类层次结构设计
首先,我们需要定义一个员工的基类,我们可以称之为`Employee`,在该类中定义共有的属性和方法。接下来,我们可以创建两个子类,分别是`Programmer`(程序员)和`ProjectManager`(项目经理),这两个类继承自`Employee`类,并各自实现自己的工资计算方法。
```java
// 员工基类
public class Employee {
protected String id;
protected String name;
protected String gender;
protected double baseSalary;
public Employee(String id, String name, String gender, double baseSalary) {
this.id = id;
this.name = name;
this.gender = gender;
this.baseSalary = baseSalary;
}
// 基本工资计算方法
public double calculateSalary() {
return baseSalary;
}
}
// 程序员类
public class Programmer extends Employee {
private int overtimeHours;
public Programmer(String id, String name, String gender, double baseSalary, int overtimeHours) {
super(id, name, gender, baseSalary);
this.overtimeHours = overtimeHours;
}
// 程序员工资计算方法
@Override
public double calculateSalary() {
return super.calculateSalary() + overtimeHours * 50;
}
}
// 项目经理类
public class ProjectManager extends Employee {
private double managementBonus;
public ProjectManager(String id, String name, String gender, double baseSalary, double managementBonus) {
super(id, name, gender, baseSalary);
this.managementBonus = managementBonus;
}
// 项目经理工资计算方法
@Override
public double calculateSalary() {
return super.calculateSalary() + managementBonus;
}
}
```
### 2. 接口与抽象类
为了更好地实现多态,我们还可以定义一个工资计算的接口`SalaryCalculator`,这样可以让`Employee`类成为一个抽象类,而不直接实现工资计算方法。然后让`Programmer`和`ProjectManager`实现这个接口。
```java
// 工资计算接口
public interface SalaryCalculator {
double calculateSalary();
}
// 抽象员工类
public abstract class Employee {
// ... 同上省略属性和构造器 ...
public abstract double calculateSalary();
}
// 程序员实现工资计算接口
public class Programmer extends Employee implements SalaryCalculator {
// ... 同上省略属性和构造器 ...
@Override
public double calculateSalary() {
return super.calculateSalary() + overtimeHours * 50;
}
}
// 项目经理实现工资计算接口
public class ProjectManager extends Employee implements SalaryCalculator {
// ... 同上省略属性和构造器 ...
@Override
public double calculateSalary() {
return super.calculateSalary() + managementBonus;
}
}
```
### 3. 集合与多态操作
我们可以创建一个`Employee`类型的集合,将`Programmer`和`ProjectManager`对象放入同一个集合中,然后利用多态性来遍历集合,并调用每个对象的`calculateSalary()`方法计算工资。
```java
import java.util.ArrayList;
import java.util.List;
public class SalaryCalculatorDemo {
public static void main(String[] args) {
List<Employee> employees = new ArrayList<>();
employees.add(new Programmer("001", "张三", "男", 8000, 10));
employees.add(new ProjectManager("002", "李四", "女", 10000, 2000));
for (Employee employee : employees) {
System.out.println(employee.getName() + "的工资是:" + employee.calculateSalary());
}
}
}
```
### 4. 策略模式
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响到使用算法的客户端。在这个案例中,我们可以将不同的工资计算方法封装起来,作为一个个策略,让`Employee`类根据不同的子类来选择不同的策略。
```java
// 工资计算策略接口
public interface SalaryStrategy {
double calculateSalary(Employee employee);
}
// 程序员工资计算策略
public class ProgrammerSalaryStrategy implements SalaryStrategy {
@Override
public double calculateSalary(Employee employee) {
Programmer programmer = (Programmer) employee;
return programmer.getBaseSalary() + programmer.getOvertimeHours() * 50;
}
}
// 项目经理工资计算策略
public class ProjectManagerSalaryStrategy implements SalaryStrategy {
@Override
public double calculateSalary(Employee employee) {
ProjectManager projectManager = (ProjectManager) employee;
return projectManager.getBaseSalary() + projectManager.getManagementBonus();
}
}
// 工资计算策略应用
public class SalaryCalculatorContext {
private SalaryStrategy strategy;
public SalaryCalculatorContext(SalaryStrategy strategy) {
this.strategy = strategy;
}
public double calculateSalary(Employee employee) {
return strategy.calculateSalary(employee);
}
}
```
在以上不同的层次中,我们都展示了如何利用多态机制来设计和实现程序,以及如何通过多态去除冗余代码,提高代码的可维护性和可扩展性。通过这些层次化的解析,我们可以更好地理解和应用Java中的多态概念。
相关推荐







javaseflame
- 粉丝: 1
最新资源
- 自制DOS游戏:C语言编程与游戏设计的结晶
- 基于KPCA的SVM分类程序代码指南
- 屏幕录像与监控:VC源程序使用指南
- Windows2000 DNS深入解析与技术应用指南
- 基于Struts+Hibernate的Java超市管理系统开发
- Delphi初学者图像浏览器源码解析
- 仓库管理系统VB完整源代码参考
- 模拟退火算法应用于中国邮递员问题的实现
- 深入解析数据结构课件要点与应用
- C#操作Access数据库实现图片存取技术
- PHP Zend解密软件DezenderGUI使用体验
- PB函數大全查詢手冊:開發人員必備
- Visual C# 2005开发技术详解
- 网络监测工具的开发设计与实施要点
- ASP.NET实现网络聊天室:统计功能与信息存储
- DataGridView中自定义数字列的应用和功能解析
- 单片机MP3播放器的实现方法与源代码解析
- Eclipse 3.3.2中文包安装指南
- 汇编语言命令查询器:快速参考与分享工具
- ARM原理图与DSP设计应用详解
- JAVA小游戏实现:探索拼图游戏编程
- 局域网应用开发:VC源码解析
- C语言入门百例:掌握编程概念
- Linux操作系统启动流程深入剖析