Java之封装、继承和多态(超详细)
五、现代Java技术下的实操案例:宠物管理系统
5.1 项目概述
使用现代Java技术(Java 8+)开发一个宠物管理系统,实现宠物信息管理、行为模拟和健康状态监控功能。系统将充分应用封装、继承、多态特性,并结合Stream API、Lambda表达式和接口默认方法等新特性。
5.2 封装实践:使用Record类简化数据模型
Java 14引入的Record类是一种特殊的类,用于封装不可变数据,自动生成构造方法、getter、equals()、hashCode()和toString()方法。
// 使用Record类封装宠物基本信息(自动实现封装)
public record PetInfo(String name, int age, String breed) {
}
// 宠物健康状态类(传统封装)
public class HealthStatus {
private boolean vaccinated;
private double weight;
private String lastCheckupDate;
public HealthStatus(boolean vaccinated, double weight, String lastCheckupDate) {
this.vaccinated = vaccinated;
this.weight = weight;
this.lastCheckupDate = lastCheckupDate;
}
// Getter和Setter方法(略)
}
5.3 继承与接口设计:多层次继承结构
设计多层次继承结构,结合抽象类和接口,实现代码复用与行为扩展。
// 抽象基类:动物
public abstract class Animal {
protected final PetInfo info;
protected HealthStatus healthStatus;
public Animal(PetInfo info) {
this.info = info;
}
// 抽象方法:所有动物必须实现叫声
public abstract String makeSound();
// 模板方法模式:定义喂养流程
public final void feed() {
System.out.println(info.name() + "正在进食...");
afterFeed();
}
// 子类可扩展的钩子方法
protected void afterFeed() {
System.out.println(info.name() + "吃完了");
}
// Getter方法
public PetInfo getInfo() {
return info;
}
public HealthStatus getHealthStatus() {
return healthStatus;
}
public void setHealthStatus(HealthStatus healthStatus) {
this.healthStatus = healthStatus;
}
}
// 接口:可训练的动物
public interface Trainable {
// 接口默认方法(Java 8+)
default void train() {
System.out.println(getTrainableName() + "正在接受训练");
performTrick();
}
// 抽象方法:执行特技
void performTrick();
// 私有方法(Java 9+)
private String getTrainableName() {
return this instanceof Animal ? ((Animal) this).getInfo().name() : "未知";
}
}
// 具体子类:狗
public class Dog extends Animal implements Trainable {
public Dog(PetInfo info) {
super(info);
}
@Override
public String makeSound() {
return "汪汪汪";
}
@Override
public void performTrick() {
System.out.println(getInfo().name() + "学会了坐下和握手");
}
// 重写钩子方法
@Override
protected void afterFeed() {
System.out.println(getInfo().name() + "摇尾巴表示感谢");
}
}
// 具体子类:猫
public class Cat extends Animal {
public Cat(PetInfo info) {
super(info);
}
@Override
public String makeSound() {
return "喵喵喵";
}
// 猫特有的方法
public void scratch() {
System.out.println(getInfo().name() + "在抓沙发");
}
}
5.4 多态实践:统一接口与动态行为
通过多态实现统一的宠物管理接口,处理不同类型的宠物对象。
// 宠物管理系统
public class PetManager {
private final List<Animal> pets = new ArrayList<>();
// 添加宠物(多态参数)
public void addPet(Animal pet) {
pets.add(pet);
}
// 展示所有宠物信息(多态调用)
public void displayAllPets() {
pets.forEach(pet -> {
System.out.println("名字:" + pet.getInfo().name());
System.out.println("品种:" + pet.getInfo().breed());
System.out.println("叫声:" + pet.makeSound());
// 类型检查与向下转型
if (pet instanceof Trainable trainable) {
trainable.train();
}
if (pet instanceof Cat cat) {
cat.scratch();
}
System.out.println("-------------------");
});
}
// 使用Stream API过滤健康的宠物
public List<Animal> getHealthyPets() {
return pets.stream()
.filter(pet -> pet.getHealthStatus() != null &&
pet.getHealthStatus().isVaccinated() &&
pet.getHealthStatus().getWeight() > 0)
.toList();
}
// 使用函数式接口定义自定义过滤逻辑
public List<Animal> filterPets(Predicate<Animal> condition) {
return pets.stream()
.filter(condition)
.toList();
}
}
5.5 测试与使用示例
public class Main {
public static void main(String[] args) {
// 创建宠物
PetInfo dogInfo = new PetInfo("旺财", 3, "金毛");
Dog dog = new Dog(dogInfo);
dog.setHealthStatus(new HealthStatus(true, 25.5, "2023-05-10"));
PetInfo catInfo = new PetInfo("咪咪", 2, "英短");
Cat cat = new Cat(catInfo);
cat.setHealthStatus(new HealthStatus(true, 4.2, "2023-06-15"));
// 宠物管理系统
PetManager manager = new PetManager();
manager.addPet(dog);
manager.addPet(cat);
// 展示所有宠物
System.out.println("===== 宠物列表 =====");
manager.displayAllPets();
// 使用自定义过滤条件
System.out.println("===== 年龄大于2岁的宠物 =====");
manager.filterPets(pet -> pet.getInfo().age() > 2)
.forEach(pet -> System.out.println(pet.getInfo().name()));
}
}
5.6 设计模式应用
- 模板方法模式:在
Animal
类中定义喂养流程的模板,子类可以重写特定步骤。 - 策略模式:通过
Predicate<Animal>
接口实现宠物过滤策略的动态切换。 - 单一职责原则:每个类只负责单一功能,如
PetInfo
负责数据封装,PetManager
负责业务逻辑。
六、最佳实践建议
6.1 封装优化
- 使用不可变对象:优先使用
final
和Record
类创建不可变对象,减少并发问题。 - 遵循LOD法则(迪米特法则):一个对象应当对其他对象有最少的了解,降低耦合度。
6.2 继承优化
- 组合优于继承:避免过度继承导致的类爆炸问题,优先使用组合关系实现代码复用。
- 使用接口多实现:通过实现多个接口替代多重继承,增强代码灵活性。
6.3 多态优化
- 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖抽象。
- 使用泛型增强多态性:通过泛型方法和类提高代码的通用性。
七、常见问题与解决方案
7.1 继承滥用问题
问题:过度继承导致类层次结构复杂,维护困难。
解决方案:使用组合模式或接口实现替代深度继承。
7.2 多态类型转换异常
问题:向下转型时出现ClassCastException
。
解决方案:使用instanceof
进行类型检查,或通过Visitor模式避免类型转换。
7.3 封装破坏问题
问题:错误地将内部实现暴露给外部。
解决方案:严格控制访问权限,使用private
和package-private
修饰符。
这个实操案例结合了现代Java特性,展示了如何在真实项目中应用封装、继承和多态。你可以基于此案例进一步扩展功能,如添加更多宠物类型、实现健康数据可视化等。如果需要对特定部分进行更详细的解释或优化建议,欢迎提出具体需求。
Java 开发,宠物管理系统,Spring Boot,MyBatis,MySQL,RESTful API,Spring Security,JWT,Redis,Spring Data JPA,WebSocket,Swagger, 微服务,前后端分离,云部署
资源地址:
https://pan.quark.cn/s/14fcf913bae6