OO4-6次作业作业总结
总结性博客:Java题目习题集4-6学习心得
一、前言
通过三次习题集的练习,我对面向对象编程(OOP)、集合框架和输入输出操作有了更加深刻的理解。这三次题目涵盖的内容主要包括以下几个方面:
-
题目知识点:
第一次习题集:以Java的继承与多态为核心,强化对类与对象的理解,设计与实现了多个基于父类与子类的题目(如教师与学生、员工与本科生)。
第二次习题集:探索集合框架的使用,包括List
、Iterator
的操作,涉及学生与员工管理场景。
第三次习题集:更复杂的设计题目,包括智能家居模拟系统,模拟电路设备的工作逻辑,结合面向对象的抽象与实现。 -
题目数量与难度:
每次习题量为 56 道,难度呈递进关系。
第一次习题:较为基础,主要考察类的继承和方法重写。
第二次习题:涉及集合框架,要求对集合操作有一定的实践。
第三次习题:综合性强,设计复杂的智能家居电路模拟,较高的代码量和逻辑推理要求。 -
学习目标:
熟练掌握面向对象编程。
提高程序的设计与优化能力。
深入理解Java集合框架。
解决多场景下复杂逻辑问题。
二、设计与分析
本次重点分析习题集中 第三次习题 的一题——智能家居强电电路模拟程序。
-
核心设计概述:
通过类的继承和多态实现了控制设备与受控设备的功能。
利用输入解析方法,动态处理各种连接信息,并计算电压传递逻辑。 -
代码结构:
设备类层级设计
主要功能模块:
设备的状态管理:每种设备有不同的状态逻辑(如开关的开/关、风扇的转速等)。
电压传递与计算:基于串联和并联电路的信息,递归计算各设备的输出状态。
输入解析:解析复杂的输入格式,动态生成电路连接。 -
代码分析:
1.电压递归传递逻辑
这一段代码实现了设备之间的电压递归传递,是整个智能家居电路模拟程序的核心逻辑
原始代码片段:
private void propagateVoltage(String pin, double voltage) {
if (!connections.containsKey(pin)) return; // 如果没有连接到其他引脚,直接返回
String connectedPin = connections.get(pin); // 获取与当前引脚连接的另一端引脚
Device device = devices.get(connectedPin.split("-")[0]); // 获取连接的设备
if (device != null) {
device.update(voltage); // 更新设备的状态
double outputVoltage = voltage; // 假设初始电压未被改变
// 如果是控制设备,计算输出电压
if (device instanceof StepSpeedController) {
outputVoltage = ((StepSpeedController) device).getOutputVoltage(voltage);
} else if (device instanceof ContinuousSpeedController) {
outputVoltage = ((ContinuousSpeedController) device).getOutputVoltage(voltage);
}
// 递归传播电压到下一个引脚
propagateVoltage(connectedPin, outputVoltage);
}
}
分析与解读:
功能描述:
该方法用于将电压从一个设备传递到下一个设备,并根据设备的特性计算电压变化。
使用递归方式处理设备连接链路,适用于串联电路的模拟。
关键实现点:
连接关系查询:
利用connections字典存储引脚间的连接关系,通过引脚查询其连接的另一端。
connections.get(pin)返回连接引脚,确保递归传播的方向性。
设备电压更新:
根据设备类型(如调速器)动态计算输出电压。
使用instanceof检查设备类型,并调用具体设备类的方法进行计算。
递归调用:
递归传递电压到下一个设备的引脚,模拟电压在电路中的传播过程。
潜在问题与优化建议:
问题1:重复计算
对于复杂电路,可能多次访问同一设备,导致重复计算。
优化:引入访问记录,避免已处理设备的重复递归
private Set<String> visitedPins = new HashSet<>(); if (visitedPins.contains(pin)) return; visitedPins.add(pin);
问题2:类型检查较繁琐
使用instanceof进行设备类型判断,耦合性较高。
优化:通过设备基类定义统一的getOutputVoltage()接口,具体逻辑由子类实现,简化代码。
2.调速器的档位控制逻辑
调速器设备的档位控制是智能家居模拟中重要的特性。以下是StepSpeedController类中档位计算的核心代码:
class StepSpeedController extends Device {
private int level = 0; // 初始档位为0
void increaseLevel() {
if (level < 3) level++; // 增加档位,最大为3
}
void decreaseLevel() {
if (level > 0) level--; // 减少档位,最小为0
}
double getOutputVoltage(double inputVoltage) {
// 根据档位计算输出电压比例
switch (level) {
case 0: return 0;
case 1: return 0.3 * inputVoltage;
case 2: return 0.6 * inputVoltage;
case 3: return 0.9 * inputVoltage;
default: return 0;
}
}
@Override
String getStatus() {
return Integer.toString(level); // 返回档位状态
}
}
分析与解读:
功能描述:
该类模拟分档调速器,通过档位调整设备的输出电压。
支持档位增加和减少,范围在0-3之间。
关键实现点:
档位调整方法:
increaseLevel() 和 decreaseLevel() 分别控制档位增加和减少,确保档位不越界。
最大值和最小值通过简单的条件限制处理,保证设备行为合理。
输出电压计算:
根据档位使用switch分支语句计算输出电压比例。
输出电压与输入电压按比例关系确定,实现了分档调节功能。
状态获取:
getStatus() 方法返回当前档位状态,用于外部查询设备信息。
潜在问题与优化:
问题1:档位范围的硬编码
档位最大值3和比例值直接写死在代码中,若未来需要扩展为4档或5档需要修改代码。
优化:将档位范围和比例设置为配置参数
private static final double[] LEVEL_OUTPUT_RATIO = {0, 0.3, 0.6, 0.9};
double getOutputVoltage(double inputVoltage) {
return LEVEL_OUTPUT_RATIO[level] * inputVoltage;
}
问题2:输出电压计算耦合性较高
档位逻辑直接耦合在getOutputVoltage()中,扩展性有限。
优化:提取档位逻辑为独立模块,支持动态配置档位电压比例。
三、采坑心得
在源码提交和调试过程中,以下是遇到的主要问题及对应解决方法:
-
问题一:递归电压传递导致栈溢出
原因:在设备连接信息复杂时,未设置递归终止条件。
解决:在递归函数中,添加访问记录,避免重复访问同一设备。 -
问题二:输入解析中的格式错误
原因:部分输入格式未完全匹配预期,导致Pattern
匹配失败。
解决:调整正则表达式,加入对特殊情况的处理,如T
与M
解析分开处理。 -
问题三:电路状态输出不正确
原因:调速器档位或开关状态未正确更新。
解决:在状态更新时,确保正确传递输入电压;同时测试多个输入样例,修复边界问题。
四、改进建议
针对本次习题的代码实现,我提出以下改进建议:
-
模块化设计:
将电压计算与状态更新分离为独立模块,降低方法复杂度。
引入日志记录模块,便于调试与问题追踪。 -
输入处理优化:
对输入格式进行预处理,将格式检查独立为一个函数,提高代码可读性。 -
性能优化:
对设备连接的递归处理,加入缓存以减少重复计算。
对设备列表排序,避免在输出时重复排序操作。 -
扩展性:
引入配置文件,支持动态扩展设备类型和连接规则。
为设备类增加通用接口,便于未来功能迭代。
五、扩展性设计与思考
在实际开发中,代码的扩展性和复用性非常重要。以下是对习题集代码的扩展性设计和一些未来可能的改进方向:
- 可扩展的设备框架设计
可以通过增加以下内容,进一步提升设备类框架的扩展能力:
抽象接口:将设备的通用功能抽象为接口,如Controllable(可控制)和Updatable(可更新),实现对复杂设备的统一管理。
配置化支持:通过JSON或XML文件描述设备类型、连接关系等,使系统支持动态扩展新设备。
示例代码:设备抽象接口
interface Device {
String getStatus(); // 获取状态
void update(double voltage); // 更新设备状态
}
// 可控制设备接口
interface Controllable {
void control(String command); // 接收控制命令
}
// 开关实现了设备和控制接口
class Switch implements Device, Controllable {
private boolean isClosed = false;
@Override
public String getStatus() {
return isClosed ? "closed" : "turned on";
}
@Override
public void update(double voltage) {
// 开关无需更新电压
}
@Override
public void control(String command) {
isClosed = !isClosed; // 切换开关状态
}
}
通过这样的设计,可以轻松扩展支持其他设备(如电梯、传感器等)
六、总结
经过三次题目集的练习,我不仅加深了对Java语言的理解,也学会了如何从复杂场景出发,设计高效的程序结构。以下是我的收获和改进方向:
-
主要收获:
学会在继承与多态基础上设计更复杂的类层次结构。
提升了对集合框架的使用能力。
了解如何通过正则表达式解析复杂输入。
掌握了电路模拟场景中的逻辑处理技巧。 -
需改进的地方:
提升算法的效率,优化时间复杂度。
加强对边界情况的考虑,避免程序崩溃。
学习如何撰写单元测试,确保代码质量。 -
对课程与实验的建议:
增加代码设计的专题课程,讲解如何优化代码结构。
提供更多有趣的实践题目,如物联网和人工智能方向。
增强对代码风格与规范的要求,帮助学生养成良好的编程习惯。
通过这三次练习,我从理论到实践完成了一个完整的学习闭环。期待后续的课程可以带来更多挑战与收获!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异