BlueJ面向对象编程作业:DigitalClock数字时钟实现及Java OOP练习建议
DigitalClock 数字时钟类实现方案
一、现有代码已知问题修正
你当前的代码存在几个会导致编译失败或逻辑不符合要求的问题,先逐个修正:
- 变量名不匹配:私有属性定义为
h/m/s,但get方法、toString中使用了未定义的hour/minute/second变量 - set方法逻辑错误:
- setMinute、setSecond的注释标注错误,实际对应分、秒字段
- setMinute、setSecond中小于0时赋值为1不符合要求,要求无效值赋值为0
- 时字段校验逻辑和功能需求冲突:功能示例为24小时制(支持23点,进位后为0点),现有setHour限制1-12的12小时制,需调整为0-23的校验规则
- toString方法存在语法错误:缺少语句分号、拼接符号、引号使用错误
二、核心功能实现逻辑
1. 访问器(get)方法修正
直接返回对应私有属性即可,示例:
public int getHour() { return this.h; } public int getMinute() { return this.m; } public int getSecond() { return this.s; }
2. 时间更新方法实现
核心逻辑是低位满量程则归零,同时向高位进位,复用已有方法减少重复代码:
nextSecond() 逻辑
- 秒数+1,判断是否等于60:
- 是:秒数设为0,调用
nextMinute()完成分钟进位 - 否:直接赋值新的秒数
代码示例:
- 是:秒数设为0,调用
public void nextSecond() { int newS = this.s + 1; if (newS == 60) { this.s = 0; nextMinute(); } else { this.s = newS; } }
nextMinute() 逻辑
和秒的逻辑完全一致,满60归零后向小时进位:
public void nextMinute() { int newM = this.m + 1; if (newM == 60) { this.m = 0; nextHour(); } else { this.m = newM; } }
nextHour() 逻辑
24小时制满24则归零,无需再进位:
public void nextHour() { int newH = this.h + 1; if (newH == 24) { this.h = 0; } else { this.h = newH; } }
3. toString() 方法实现
要求返回HH:MM:SS格式,不足两位补前导零,可以用Java自带的字符串格式化方法实现:
@Override public String toString() { // %02d表示将整数格式化为2位,不足则前面补0 return String.format("%02d:%02d:%02d", this.h, this.m, this.s); }
4. set方法修正
调整小时校验为24小时制,修正分、秒的校验逻辑:
public void setHour(int h) { if (h < 0) { this.h = 0; } else if (h > 23) { this.h = 23; } else { this.h = h; } } public void setMinute(int m) { if (m < 0 || m > 59) { // 分的有效值是0-59 this.m = 0; } else { this.m = m; } } public void setSecond(int s) { if (s < 0 || s > 59) { // 秒的有效值是0-59 this.s = 0; } else { this.s = s; } }
三、Java面向对象编程练习推荐方式
- 聚焦单个知识点练习:每次练习只练一个OO特性,比如练封装就重点写私有属性、带校验的set/get方法,禁止外部直接修改属性;练继承就写父子类复用公共逻辑
- 单方法测试优先:写完一个方法立刻测试,比如在BlueJ中创建类实例,直接调用方法验证输出是否符合预期,不要攒完全部代码再调试
- 从简单需求切入:先写学生类、计算器类、计数器类这种功能单一的小类,熟练后再写多个类联动的项目
- 优先考虑方法复用:写逻辑时先看有没有已实现的方法可以调用,比如本次时间进位就复用nextMinute、nextHour方法,不要重复写相同逻辑
完整可运行代码
public class DigitalClock { private int h; private int m; private int s; public DigitalClock(int h, int m, int s) { setTime(h, m, s); } public void setTime(int h, int m, int s) { setHour(h); setMinute(m); setSecond(s); } public void setHour(int h) { if (h < 0) { this.h = 0; } else if (h > 23) { this.h = 23; } else { this.h = h; } } public void setMinute(int m) { if (m < 0 || m > 59) { this.m = 0; } else { this.m = m; } } public void setSecond(int s) { if (s < 0 || s > 59) { this.s = 0; } else { this.s = s; } } public void nextHour() { int newH = this.h + 1; if (newH == 24) { this.h = 0; } else { this.h = newH; } } public void nextMinute() { int newM = this.m + 1; if (newM == 60) { this.m = 0; nextHour(); } else { this.m = newM; } } public void nextSecond() { int newS = this.s + 1; if (newS == 60) { this.s = 0; nextMinute(); } else { this.s = newS; } } public int getHour() { return this.h; } public int getMinute() { return this.m; } public int getSecond() { return this.s; } @Override public String toString() { return String.format("%02d:%02d:%02d", this.h, this.m, this.s); } }
内容的提问来源于stack exchange,提问作者Gvbe _
相关产品推荐
相关产品推荐

