本文目录导读:

这是一个典型的Java后端开发招聘案例,通常用于考察候选人的编程基础、面向对象思维、异常处理以及代码规范,我们来看一个经典的“员工管理系统”或“简易订单计算”场景:
📌 案例名称:简易员工薪资计算系统
需求描述
某公司需要开发一个简易的员工薪资计算模块:
- 员工分为两类:
- 全职员工 (FullTimeEmployee):每月固定工资 + 绩效奖金。
- 兼职员工 (PartTimeEmployee):按小时计薪(时薪 × 工作小时数)。
- 要求:
- 能计算并打印每个员工的月薪。
- 员工年龄不能小于18岁(需进行合法性校验)。
- 所有员工需实现一个统一的接口或抽象方法。
考察点
| 考察维度 | |
|---|---|
| 面向对象设计 | 抽象类/接口设计,继承与多态 |
| 异常处理 | 自定义异常处理非法年龄、非法工时 |
| 集合与遍历 | 使用List/ArrayList存储员工,循环计算薪资 |
| 代码规范 | 命名规范、注释、getter/setter使用 |
| 扩展性 | 未来若增加“实习生”类型,能否方便扩展 |
💻 代码实现示例
// 1. 员工抽象类
public abstract class Employee {
private String name;
private int age;
public Employee(String name, int age) {
if (age < 18) {
throw new IllegalArgumentException("员工年龄不能小于18岁");
}
this.name = name;
this.age = age;
}
public abstract double calculateSalary(); // 抽象方法:计算薪资
public void printSalary() {
System.out.println(name + " 本月薪资: " + calculateSalary() + " 元");
}
// getter/setter
public String getName() { return name; }
public int getAge() { return age; }
}
// 2. 全职员工子类
public class FullTimeEmployee extends Employee {
private double baseSalary;
private double bonus;
public FullTimeEmployee(String name, int age, double baseSalary, double bonus) {
super(name, age);
this.baseSalary = baseSalary;
this.bonus = bonus;
}
@Override
public double calculateSalary() {
return baseSalary + bonus;
}
}
// 3. 兼职员工子类
public class PartTimeEmployee extends Employee {
private double hourlyWage;
private int hoursWorked;
public PartTimeEmployee(String name, int age, double hourlyWage, int hoursWorked) {
super(name, age);
if (hoursWorked < 0 || hoursWorked > 200) {
throw new IllegalArgumentException("无效工时(0-200小时)");
}
this.hourlyWage = hourlyWage;
this.hoursWorked = hoursWorked;
}
@Override
public double calculateSalary() {
return hourlyWage * hoursWorked;
}
}
// 4. 测试类
import java.util.ArrayList;
import java.util.List;
public class PayrollSystem {
public static void main(String[] args) {
List<Employee> employees = new ArrayList<>();
try {
employees.add(new FullTimeEmployee("张三", 28, 8000, 2000));
employees.add(new PartTimeEmployee("李四", 22, 50, 120));
employees.add(new FullTimeEmployee("王五", 35, 10000, 3000));
// 下面这行会触发异常(年龄17岁)
employees.add(new FullTimeEmployee("小明", 17, 5000, 1000));
} catch (IllegalArgumentException e) {
System.out.println("❌ 添加员工失败:" + e.getMessage());
}
System.out.println("===== 员工薪资报告 =====");
for (Employee emp : employees) {
emp.printSalary();
}
}
}
🔍 常见追问(面试官考你)
-
为什么用抽象类而不是接口? → 因为Employee有公共属性(name/age),适合抽象类;若未来需要实现“可序列化”等功能,可搭配接口。
-
如果兼职员工工作小时数超过200,怎么处理? → 可用自定义异常类(如
InvalidHoursException extends RuntimeException)增强语义。 -
如何支持新员工类型(如“实习生”)? → 只需再创建一个子类继承Employee,覆盖calculateSalary即可,无需修改现有代码(开闭原则)。
-
如果要求所有员工按薪资排序,如何实现? → 让Employee实现
Comparable<Employee>接口,重写compareTo方法,或使用Comparator。
✅ 评分参考(满分10分)
| 项目 | 分数 | 常见扣分点 |
|---|---|---|
| 类设计合理性 | 3分 | 未使用抽象类/接口,职责混乱 |
| 异常处理 | 2分 | 未校验年龄/工时,或抛异常后未处理 |
| 多态运用 | 2分 | 循环中未用父类引用,硬编码类型 |
| 代码规范 | 2分 | 命名不清、无注释、魔法值 |
| 扩展性考虑 | 1分 | 完全无扩展意识 |
这个案例既简单又能反映候选人实际工程能力。真正的加分项往往在:
- 是否主动校验数据
- 是否合理处理异常(而非抛给JVM)
- 是否写出可维护的代码结构(哪怕只是个小demo)
你希望我再帮你分析一个其他类型的Java案例吗?设计模式应用”或“多线程并发场景”?