本文目录导读:

我将为您提供多个抽象类的实际案例,从简单到复杂,帮助您理解抽象类的使用场景和设计思路。
案例1:图形类(入门级)
// 抽象类 - 图形
abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
// 抽象方法 - 子类必须实现
public abstract double getArea();
public abstract double getPerimeter();
// 具体方法 - 子类可以直接使用
public void display() {
System.out.println("颜色: " + color);
System.out.println("面积: " + getArea());
System.out.println("周长: " + getPerimeter());
}
}
// 子类 - 圆形
class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
// 子类 - 矩形
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(String color, double width, double height) {
super(color);
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
}
// 测试类
public class ShapeTest {
public static void main(String[] args) {
Shape circle = new Circle("红色", 5.0);
Shape rectangle = new Rectangle("蓝色", 4.0, 6.0);
System.out.println("=== 圆形 ===");
circle.display();
System.out.println("\n=== 矩形 ===");
rectangle.display();
}
}
案例2:支付系统(实用级)
// 抽象类 - 支付
abstract class Payment {
protected String merchantId;
protected double amount;
protected String orderId;
public Payment(String merchantId, double amount, String orderId) {
this.merchantId = merchantId;
this.amount = amount;
this.orderId = orderId;
}
// 抽象方法 - 各支付方式的不同实现
public abstract boolean authenticate();
public abstract boolean processPayment();
public abstract String generateReceipt();
// 模板方法模式 - 定义支付流程
public final void executePayment() {
System.out.println("=== 开始支付流程 ===");
if (!authenticate()) {
System.out.println("认证失败");
return;
}
if (!processPayment()) {
System.out.println("支付失败");
return;
}
String receipt = generateReceipt();
System.out.println("支付成功,收据: " + receipt);
sendConfirmation(receipt);
}
// 具体方法 - 通用逻辑
private void sendConfirmation(String receipt) {
System.out.println("发送支付确认通知...");
System.out.println("确认信息: " + receipt);
System.out.println("=== 支付流程结束 ===");
}
}
// 支付宝支付
class AlipayPayment extends Payment {
private String alipayAccount;
public AlipayPayment(double amount, String orderId, String alipayAccount) {
super("ALIPAY_MERCHANT", amount, orderId);
this.alipayAccount = alipayAccount;
}
@Override
public boolean authenticate() {
System.out.println("支付宝认证 - 账号: " + alipayAccount);
return true;
}
@Override
public boolean processPayment() {
System.out.println("支付宝处理支付: " + amount + "元");
return true;
}
@Override
public String generateReceipt() {
return "支付宝收据 - 订单" + orderId + " - " + amount + "元";
}
}
// 微信支付
class WechatPayment extends Payment {
private String wechatId;
public WechatPayment(double amount, String orderId, String wechatId) {
super("WECHAT_MERCHANT", amount, orderId);
this.wechatId = wechatId;
}
@Override
public boolean authenticate() {
System.out.println("微信认证 - 微信ID: " + wechatId);
return true;
}
@Override
public boolean processPayment() {
System.out.println("微信处理支付: " + amount + "元");
return true;
}
@Override
public String generateReceipt() {
return "微信收据 - 订单" + orderId + " - " + amount + "元";
}
}
// 银行卡支付
class BankCardPayment extends Payment {
private String cardNumber;
public BankCardPayment(double amount, String orderId, String cardNumber) {
super("BANK_MERCHANT", amount, orderId);
this.cardNumber = cardNumber;
}
@Override
public boolean authenticate() {
System.out.println("银行卡认证 - 卡号: " + cardNumber.substring(0, 4) + "****");
return true;
}
@Override
public boolean processPayment() {
System.out.println("银行处理支付: " + amount + "元");
return true;
}
@Override
public String generateReceipt() {
return "银行收据 - 订单" + orderId + " - " + amount + "元";
}
}
// 测试类
public class PaymentTest {
public static void main(String[] args) {
System.out.println("=== 支付宝支付 ===");
Payment alipay = new AlipayPayment(100.0, "ORDER001", "user@alipay.com");
alipay.executePayment();
System.out.println("\n=== 微信支付 ===");
Payment wechat = new WechatPayment(200.0, "ORDER002", "wx_user123");
wechat.executePayment();
System.out.println("\n=== 银行卡支付 ===");
Payment bankCard = new BankCardPayment(300.0, "ORDER003", "6222021234567890");
bankCard.executePayment();
}
}
案例3:员工管理系统(进阶级)
// 抽象类 - 员工
abstract class Employee {
protected String name;
protected int employeeId;
protected double baseSalary;
public Employee(String name, int employeeId, double baseSalary) {
this.name = name;
this.employeeId = employeeId;
this.baseSalary = baseSalary;
}
// 抽象方法
public abstract double calculateSalary();
public abstract String getRole();
// 具体方法
public void displayInfo() {
System.out.println("==========");
System.out.println("标题: " + getRole());
System.out.println("姓名: " + name);
System.out.println("工号: " + employeeId);
System.out.println("薪资: " + calculateSalary() + "元");
performWork();
}
// 钩子方法 - 子类可选覆盖
protected void performWork() {
System.out.println("执行一般工作");
}
}
// 永久员工
class PermanentEmployee extends Employee {
private double bonus;
private int yearsOfService;
public PermanentEmployee(String name, int employeeId, double baseSalary,
double bonus, int yearsOfService) {
super(name, employeeId, baseSalary);
this.bonus = bonus;
this.yearsOfService = yearsOfService;
}
@Override
public double calculateSalary() {
// 基本工资 + 奖金 + 工龄工资(每年增加200)
return baseSalary + bonus + (yearsOfService * 200);
}
@Override
public String getRole() {
return "永久员工";
}
@Override
protected void performWork() {
System.out.println("完成项目开发和团队协作");
}
}
// 临时员工
class TemporaryEmployee extends Employee {
private int workDays;
private double dailyRate;
public TemporaryEmployee(String name, int employeeId, double dailyRate, int workDays) {
super(name, employeeId, 0);
this.dailyRate = dailyRate;
this.workDays = workDays;
}
@Override
public double calculateSalary() {
return dailyRate * workDays;
}
@Override
public String getRole() {
return "临时员工";
}
@Override
protected void performWork() {
System.out.println("完成临时性的工作任务");
}
}
// 实习生
class InternEmployee extends Employee {
private double stipend;
public InternEmployee(String name, int employeeId, double stipend) {
super(name, employeeId, 0);
this.stipend = stipend;
}
@Override
public double calculateSalary() {
return stipend;
}
@Override
public String getRole() {
return "实习生";
}
@Override
protected void performWork() {
System.out.println("学习并协助项目工作");
}
}
// 测试类
public class EmployeeTest {
public static void main(String[] args) {
// 多态 - 使用基类引用
Employee[] employees = {
new PermanentEmployee("张三", 1001, 8000, 2000, 3),
new TemporaryEmployee("李四", 2001, 300, 20),
new InternEmployee("王五", 3001, 1500)
};
System.out.println("=== 员工信息系统 ===\n");
double totalSalary = 0;
for (Employee emp : employees) {
emp.displayInfo();
totalSalary += emp.calculateSalary();
System.out.println();
}
System.out.println("公司总薪资支出: " + totalSalary + "元");
}
}
案例4:数据处理器(设计模式级)
// 抽象类 - 数据处理器(使用模板方法模式)
abstract class DataProcessor {
// 模板方法 - 定义数据处理流程
public final void process(String data) {
Object validated = validate(data);
Object cleaned = clean(validated);
Object transformed = transform(cleaned);
String result = save(transformed);
notifyResult(result);
}
// 抽象方法
protected abstract Object validate(String data);
protected abstract Object clean(Object data);
protected abstract Object transform(Object data);
protected abstract String save(Object data);
// 钩子方法
protected void notifyResult(String result) {
System.out.println("数据已保存: " + result);
}
}
// 字符串处理器
class StringDataProcessor extends DataProcessor {
@Override
protected Object validate(String data) {
System.out.println("验证字符串数据...");
if (data == null || data.isEmpty()) {
throw new IllegalArgumentException("字符串不能为空");
}
return data.trim();
}
@Override
protected Object clean(Object data) {
System.out.println("清理字符串数据...");
String str = (String) data;
return str.toLowerCase().replaceAll("[^a-zA-Z0-9\\s]", "");
}
@Override
protected Object transform(Object data) {
System.out.println("转换字符串数据...");
String str = (String) data;
return "transformed_" + str;
}
@Override
protected String save(Object data) {
System.out.println("保存到文本文件...");
return "text_file_" + System.currentTimeMillis() + ".txt";
}
}
// 数字处理器
class NumericDataProcessor extends DataProcessor {
@Override
protected Object validate(String data) {
System.out.println("验证数字数据...");
try {
return Double.parseDouble(data);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("无效的数字格式: " + data);
}
}
@Override
protected Object clean(Object data) {
System.out.println("清理数字数据...");
double num = (Double) data;
return Math.round(num * 100.0) / 100.0; // 保留两位小数
}
@Override
protected Object transform(Object data) {
System.out.println("转换数字数据...");
double num = (Double) data;
return num * 100;
}
@Override
protected String save(Object data) {
System.out.println("保存到数据库...");
return "db_record_" + data;
}
@Override
protected void notifyResult(String result) {
System.out.println("数字数据已存储: " + result);
}
}
// JSON处理器
class JsonDataProcessor extends DataProcessor {
@Override
protected Object validate(String data) {
System.out.println("验证JSON数据...");
if (!data.startsWith("{")) {
throw new IllegalArgumentException("无效的JSON格式");
}
return data;
}
@Override
protected Object clean(Object data) {
System.out.println("清理JSON数据...");
String json = (String) data;
// 模拟清理JSON格式
return json.replaceAll("\\s+", "");
}
@Override
protected Object transform(Object data) {
System.out.println("转换JSON数据...");
String json = (String) data;
// 模拟添加时间戳
return json.replace("}", ",\"timestamp\":\"" + System.currentTimeMillis() + "\"}");
}
@Override
protected String save(Object data) {
System.out.println("保存到MongoDB...");
return "mongo_doc_" + data.hashCode();
}
}
// 测试类
public class DataProcessorTest {
public static void main(String[] args) {
System.out.println("=== 字符串数据处理器 ===");
DataProcessor stringProcessor = new StringDataProcessor();
stringProcessor.process(" Hello World 123! ");
System.out.println("\n=== 数字数据处理器 ===");
DataProcessor numericProcessor = new NumericDataProcessor();
numericProcessor.process("12345.6789");
System.out.println("\n=== JSON数据处理器 ===");
DataProcessor jsonProcessor = new JsonDataProcessor();
jsonProcessor.process("{\"name\":\"张三\", \"age\":30}");
}
}
抽象类设计要点总结
最佳实践
- 模板方法模式: 在抽象类中定义算法骨架,子类实现具体步骤
- 钩子方法: 提供可选的扩展点,子类可以选择是否覆盖
- 代码复用: 将公共代码放在抽象类中,子类专注实现差异化逻辑
重要特性
// 抽象类可以有构造器(供子类调用) // 抽象类可以有成员变量 // 抽象类可以有具体方法(非抽象方法) // 抽象类可以有静态方法 // 抽象类不能实例化(不能new) // 抽象方法必须被非抽象子类实现 // 抽象类可以没有抽象方法(作为基类使用)
与接口的选择建议
- 当有共同实现代码时使用抽象类
- 当存在"is-a"关系时使用抽象类
- 模板方法模式优先使用抽象类
- 表示能力强,需要继承时使用抽象类
这些案例展示了抽象类在实际项目中的常见应用场景,从基础的图形计算到复杂的企业级应用,每个案例都包含了完整的代码实现,您可以直接运行测试。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播