概述
本文整合课堂6项Java课后作业,包含IO流文件复制、匿名内部类耗时统计、枚举三大业务场景、素数判断、形式化方法与UML阅读笔记,每项附带完整可运行代码+原理文字分析,记录课堂练习,便于后续复习查阅。
一、作业1:匿名内部类——统计方法执行耗时(homework1)
需求说明
利用匿名内部类封装待执行业务逻辑,统一实现方法运行毫秒/秒数统计,体现匿名内部类「无需单独定义子类、快速重写接口方法」的典型使用场景。
完整代码
// 定义函数式接口,承载待执行任务
interface Task {
void run();
}
public class TimeCountDemo {
// 统一耗时统计模板方法
public static void countTime(Task task) {
long start = System.currentTimeMillis();
// 执行传入的业务逻辑(匿名内部类实现)
task.run();
long end = System.currentTimeMillis();
double sec = (end - start) / 1000.0;
System.out.println("方法执行总耗时:" + sec + " 秒");
}
public static void main(String[] args) {
// 匿名内部类重写run方法,传入自定义业务
countTime(new Task() {
@Override
public void run() {
// 模拟耗时业务:循环计算
long sum = 0;
for (long i = 1; i <= 100000000; i++) {
sum += i;
}
System.out.println("循环计算完成,总和:" + sum);
}
});
}
}
代码分析
- 定义
Task函数式接口,作为统一任务执行规范; countTime为通用耗时工具方法,固定记录起止时间,抽取公共逻辑,减少重复代码;main中使用匿名内部类实现接口,不用新建独立.java子类文件,适合一次性临时业务逻辑;- 适用场景:工具类计时、回调逻辑、一次性执行任务,是匿名内部类最经典课堂案例。
二、作业2:IO流四类文件复制实现(文本/字符缓冲/字节/字节缓冲)
需求说明
分别实现4种文件复制方式,区分字符流(仅文本)、字节流(万能所有文件)、缓冲流(带缓冲区,读写性能最优)的差异。
完整代码
import java.io.*;
public class FileCopyDemo {
// 1. 基础字符文件复制(仅txt文本,无缓冲)
public static void copyByReaderWriter(String src, String dest) throws IOException {
FileReader fr = new FileReader(src);
FileWriter fw = new FileWriter(dest);
int ch;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
}
// 2. 字符缓冲流复制(课堂最常用,文本高性能)
public static void copyByBufferedChar(String src, String dest) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(dest));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 还原换行格式
}
bw.close();
br.close();
}
// 3. 基础字节流复制(万能,支持图片/视频/压缩包)
public static void copyByStream(String src, String dest) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fos.close();
fis.close();
}
// 4. 字节缓冲流复制(万能复制,性能最优,工程推荐)
public static void copyByBufferedByte(String src, String dest) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
byte[] buf = new byte[1024]; // 自定义缓冲区数组
int len;
while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
bos.flush(); // 强制刷出缓冲区残留数据
bos.close();
bis.close();
}
public static void main(String[] args) throws IOException {
String source = "test.txt";
String target = "copy_test.txt";
// 切换不同方法测试
copyByBufferedChar(source, target);
System.out.println("文件复制完成");
}
}
代码分析
- 字符流(Reader/Writer):仅处理纯文本,无法复制图片、exe等二进制文件;基础单字符读写速度慢,
Buffered缓冲字符流按行读取,课堂处理作业文档首选; - 字节流(InputStream/OutputStream):底层二进制读写,万能适配全部文件类型;基础单字节循环效率极低;
- 缓冲流Buffered:内置缓冲区,减少磁盘IO交互,读写速度大幅提升,工程文件复制标准方案;
- 核心选择规则:文本文件优先字符缓冲流,多媒体/程序二进制文件必须字节缓冲流。
三、作业3:枚举类型三大应用场景实现
枚举课堂给出3个核心业务场景:状态/类型定义、策略模式替换if/else、后端统一返回码,分别实现案例代码。
场景1:状态/类型定义(订单状态,最常用)
// 例1:订单状态枚举
enum OrderStatus {
UNPAID("未支付"), PAID("已付款"), DELIVERED("已发货"), FINISH("已完成");
private String desc;
OrderStatus(String desc) { this.desc = desc; }
public String getDesc() { return desc; }
}
场景2:策略模式,替代大量if/else(支付方式)
// 例2:策略枚举,消除多层if判断
interface PayStrategy {
void pay(double money);
}
enum PayType implements PayStrategy {
WECHAT {
@Override
public void pay(double money) {
System.out.println("微信支付:" + money + "元");
}
},
ALIPAY {
@Override
public void pay(double money) {
System.out.println("支付宝支付:" + money + "元");
}
};
}
// 测试
class EnumTest {
public static void main(String[] args) {
PayType.ALIPAY.pay(99.9);
}
}
场景3:后端统一返回码(接口标准返回枚举)
// 例3:后端项目标准响应码
enum ResultCode {
SUCCESS(200, "操作成功"),
FAIL(500, "服务器异常"),
PARAM_ERROR(400, "参数非法");
private int code;
private String msg;
ResultCode(int c, String m) {
code = c; msg = m;
}
// getter方法
public int getCode() { return code; }
public String getMsg() { return msg; }
}
代码分析
- 场景1:固定有限状态(订单、用户权限、消息类型),枚举替代魔法数字,可读性强、编译期校验,避免非法数值;
- 场景2:枚举实现接口,每个枚举常量独立重写业务方法,彻底消除臃肿if/else分支,符合开闭原则;
- 场景3:后端开发标配,统一接口返回状态码,团队开发规范统一,前端解析返回结果更便捷。
四、作业4:prime numbers 素数判断程序
完整代码
public class PrimeDemo {
// 判断数字是否为素数
public static boolean isPrime(int num) {
if (num <= 1) return false;
if (num == 2) return true;
if (num % 2 == 0) return false;
// 优化:遍历到平方根即可,减少循环次数
for (int i = 3; i <= Math.sqrt(num); i += 2) {
if (num % i == 0) return false;
}
return true;
}
// 输出1~max范围内所有素数
public static void printPrime(int max) {
System.out.println("1-" + max + "范围内素数:");
for (int i = 2; i <= max; i++) {
if (isPrime(i)) System.out.print(i + " ");
}
}
public static void main(String[] args) {
printPrime(100);
}
}
代码分析
- 素数定义:大于1,仅能被1和自身整除的自然数;
- 性能优化:偶数直接过滤,循环上限取数字平方根,大幅减少循环次数,提升运行效率;
- 单一职责拆分:
isPrime负责单一数字判断,printPrime负责批量输出,方法复用性更强。
五、作业5:形式化方法阅读 + 《大象——thinking in UML》读书笔记
1. 什么是形式化方法
形式化方法是一套基于数学符号、严格逻辑推理的软件开发规范,用精准、无歧义的形式语言描述软件需求、架构与程序行为,和模糊、多义的自然文字描述形成对比。
- 核心作用:消除需求漏洞、提前验证程序逻辑正确性,多用于高可靠场景(航空、嵌入式、操作系统、金融核心系统);
- 三大分类:形式化规格说明、形式化验证、形式化开发。
2. 《大象——Thinking in UML》阅读总结
- 书籍定位:零基础友好的UML建模入门书籍,依托完整项目案例讲解统一建模语言;
- 核心知识点:用例图(需求梳理)、类图(Java类/枚举/接口结构)、时序图(方法调用执行流程);
- 和本次Java课程的关联价值:
- 类图可以直观对应Java类、内部类、枚举、接口继承实现关系;
- 时序图可梳理IO流读写、匿名内部类回调等代码执行流程;
- 学习建议:写Java项目前先用UML类图画清整体结构,降低后期代码重构成本,养成先设计后编码的开发思维。
六、作业整体总结
- 基础语法层:素数程序巩固循环、分支、方法封装基础语法;
- 面向对象层:匿名内部类、枚举,掌握Java特色封装、回调、多分支优化方案;
- IO操作层:区分字符/字节/缓冲流,掌握不同场景下文件读写工程标准实现;
- 软件工程层:形式化方法与UML建模,建立标准化软件开发设计思想;
全部代码均可独立运行,覆盖课堂IO、内部类、枚举、基础算法核心知识点,适合长期归档复习。

393

被折叠的 条评论
为什么被折叠?



