Java进阶复习自测
先作答,再查看后半部分的参考答案。能说清原因比背出术语更重要。每个主题 4 题,共 56 题。
继续上次小节 →Java 进阶线 · 线路目录
Java 进阶线
对象与类型设计3 站
文件、配置与并发4 站
网络、框架与复习3 站
本页导读
Java 进阶复习自测
先作答,再查看后半部分的参考答案。能说清原因比背出术语更重要。每个主题 4 题,共 56 题。
说明:题目按 01—14 的主题编写,与现行文章的主题编号一一对应,可继续使用。文章已于 2026-10-16 改为按课程 PPT 逐日转写;若某题的表述与文章细节不同,以文章(及 课程资料校正与版本说明)为准。
问题
01|static、初始化与继承:对象如何共享数据和复用行为
-
静态方法为什么不能直接读取实例字段?
-
父类没有无参构造器时,子类怎么办?
-
重载和重写由谁决定?
-
副卡题为什么需要共享账户对象?
02|多态、抽象类与接口:让业务依赖稳定的约定
-
Animal a = new Dog() 中,谁决定能调用哪些方法?
-
final List 是否意味着列表不能新增元素?
-
抽象子类必须实现父类全部抽象方法吗?
-
两个接口的同名 default 方法冲突怎么办?
03|内部类、枚举与泛型:把对象和类型边界表达清楚
-
泛型类的静态方法能直接返回类级 T 吗?
-
List<? extends Number> 为什么不能添加 Integer?
-
两个 Integer(200) 的 == 结果是否跨环境固定?
-
匿名内部类含 static 方法,在 Java 17 中必然报错吗?
04|常用 API:字符串、精确金额与日期时间
-
BigDecimal 为什么优先从字符串构造?
-
Period.getDays() 是两个日期间的总天数吗?
-
LocalDateTime 能否独立确定全球同一个时刻?
-
为什么倒计时每次要重新计算剩余时间?
05|Lambda、方法引用、排序与正则表达式
-
Lambda 可以直接用于有两个独立抽象方法的接口吗?
-
String::compareTo 中第一个参数扮演什么角色?
-
二分查找为什么不能直接作用于乱序数组?
-
matches 和 find 有什么区别?
06|异常与 Collection:失败如何表达,元素如何组织
-
受检异常是不是编译时就发生了?
-
HashSet 只重写 equals 足够吗?
-
TreeSet 按年龄比较会留下所有同龄学生吗?
-
ConcurrentModificationException 是否一定代表多线程问题?
07|Collections 与 Map:排序、统计和购物车建模
-
TreeMap 是按键排序还是按值排序?
-
Map.get 返回 null 可以直接证明键不存在吗?
-
购物车仅用商品名称做键为什么容易出错?
-
Arrays.asList 返回的列表能新增元素吗?
08|Stream、File 与递归:数据处理和目录遍历
-
没有终结操作,filter 一定已执行吗?
-
同一个 Stream 能先 count 再 collect 吗?
-
new File 是否会自动创建磁盘文件?
-
目录大小递归遇到 listFiles 为 null 应怎么办?
09|字符编码与字节 IO:文件复制为什么会损坏或乱码
-
read(buffer) 是否保证填满 buffer?
-
复制中文文件必须先解码吗?
-
为什么逐个字节块转换为 String 可能乱码?
-
目录剪切的复制删除方案什么时候能删源?
10|字符流、缓冲流与对象序列化:IO 工具如何组合
-
BufferedReader.readLine 是否保留换行符?
-
缓冲字符流的 8192 char 就是 8192 字节吗?
-
DataInputStream 可以随意改变读取顺序吗?
-
ArrayList 可序列化,是否意味着任何元素都可写入?
11|Properties、XML 与日志:配置如何读取,问题如何定位
-
load(InputStream) 会默认按 UTF-8 读 properties 吗?
-
XML 能被解析就代表业务字段正确吗?
-
SLF4J 和 Logback 各负责什么?
-
logback.xml 是否永远必须放在源码 src 根目录?
12|多线程、同步与线程池:共享状态如何保持正确
-
两个线程各自 new 一个锁能保护同一个账户吗?
-
volatile int 的 count++ 是否原子?
-
wait 为什么一般放在 while 中?
-
shutdown 是否会阻塞到所有任务结束?
13|网络编程:UDP、TCP 与文件上传协议
-
TCP 一次 write 是否对应对端一次 read?
-
为什么上传文件后要先 flush 再 shutdownOutput?
-
TCP 传输确认是否证明文件已经保存成功?
-
HTTP Content-Length 按字符数还是字节数?
14|单元测试、反射、注解与动态代理:理解框架的基础机制
-
getDeclaredMethods 会返回父类方法吗?
-
注解没有 Retention 时,反射一定能看到吗?
-
JDK 动态代理能直接强转为目标实现类吗?
-
代理里为什么要解开 InvocationTargetException?
参考答案
-
静态方法没有当前实例。必须通过明确的对象引用读取实例字段。 回看文章
-
在 Java 17 的子类构造器首条语句位置显式调用可访问的 super(参数)。 回看文章
-
重载在编译期按签名及参数类型选择;重写实例方法在运行期按实际对象分派。 回看文章
-
主卡和副卡必须观察同一个余额,继承字段本身不会让两个对象共享实例状态。 回看文章
-
声明类型 Animal 决定编译期可见方法;Dog 决定被重写实例方法的实际实现。 回看文章
-
不是。引用不能重新指向别的列表,列表自身仍可能可修改。 回看文章
-
不必。具体子类必须提供所有所需实现;抽象子类可以继续保留抽象方法。 回看文章
-
实现类显式重写该方法,根据设计选定或组合实现。 回看文章
-
不能直接使用类级类型参数;方法可独立声明 static
<T>T method(…)。 回看文章 -
实际列表也可能是
List<Double>,编译器无法保证添加 Integer 安全。 回看文章 -
不应依赖。缓存可能扩大,业务数值比较使用 equals 或明确非空的拆箱。 回看文章
-
不必然。Java 16 起允许静态成员,但静态上下文仍受实例访问规则限制。 回看文章
-
避免把二进制 double 的近似细节带入十进制金额。 回看文章
-
不是,它只是年/月/日跨度中的日部分。总天数使用 ChronoUnit.DAYS。 回看文章
-
不能。它没有时区或偏移量,需要结合规则才能转换为 Instant。 回看文章
-
调度间隔可能延迟,直接逐次减一会积累漂移。 回看文章
-
不能,目标必须是函数式接口。 回看文章
-
作为方法接收者,后续参数传给该实例方法。 回看文章
-
排除一半候选区间的推理依赖排序规则,没有有序性就可能丢掉目标。 回看文章
-
matches 检查整体匹配;find 搜索文本中的下一个匹配片段。 回看文章
-
不是。编译器检查处理义务,异常事件仍在运行期发生。 回看文章
-
不够,要同时遵守 hashCode 约定。 回看文章
-
不一定。比较结果为 0 就按集合规则视为重复,应补充业务所需次级比较条件。 回看文章
-
不是,单线程中边迭代边通过集合结构性修改也可能触发。 回看文章
-
按键的自然顺序或指定比较器排序。 回看文章
-
不可以,允许 null 值的 Map 可能已存在该键;必要时用 containsKey。 回看文章
-
不同店铺或不同商品 ID 可能同名,键必须表达实际业务身份。 回看文章
-
不能,它是数组支持的固定大小列表;需复制到 ArrayList 后再新增。 回看文章
-
通常没有,Stream 中间操作是惰性的,需要终结操作触发。 回看文章
-
不能重复消费,需要从数据源重新获取流。 回看文章
-
不会,只创建表示路径的对象。 回看文章
-
按无法枚举的错误处理或明确记录跳过,不能默默当作空目录。 回看文章
-
不保证,返回值才是本轮有效字节数。 回看文章
-
不需要,原样复制字节即可。 回看文章
-
多字节字符可能跨块,独立解码会丢失连续状态。 回看文章
-
确认整个目标复制成功并满足验证约定后,才能开始删除源。 回看文章
-
不保留。按行读写可能改变换行格式。 回看文章
-
不是,字符数与编码后的字节数不同。 回看文章
-
不可以,类型与顺序必须符合写入协议。 回看文章
-
不是,所需对象图中的非 transient 对象也必须满足序列化要求。 回看文章
-
不会,属性流 API 按 ISO-8859-1 规则。中文 UTF-8 可使用显式编码 Reader。 回看文章
-
不代表,仍需校验必填、范围、唯一性等业务约定。 回看文章
-
SLF4J 提供日志调用接口,Logback 提供日志实现与输出配置。 回看文章
-
不是,关键是运行时 classpath 和加载配置;构建工具有自己的资源目录约定。 回看文章
-
不能,同一共享状态需要统一的锁或其他正确同步协议。 回看文章
-
不是,它仍然是读、改、写的复合操作。 回看文章
-
唤醒后条件可能仍不满足,需要处理虚假唤醒和竞争。 回看文章
-
不会。需要使用 awaitTermination 等方式等待结束。 回看文章
-
不对应,TCP 提供字节流,消息边界由应用协议定义。 回看文章
-
先把缓存内容交给底层发送,再通知对端本方向结束,同时保留回执读取。 回看文章
-
不证明,应用层需要在完成保存后返回回执。 回看文章
-
按响应正文编码后的字节数。 回看文章
-
不会,它返回当前类声明的方法;getMethods 返回 public 方法并包含适用继承成员。 回看文章
-
不能,默认 CLASS,运行期读取需要 RUNTIME。 回看文章
-
不能按这个假设使用,它实现指定接口,应按接口使用。 回看文章
-
保留目标方法真实异常语义,避免反射包装掩盖业务失败。 回看文章
五个综合练习
- 学生信息模块:用接口切换平均分算法,用 List 保存学生,用 Comparator 排序;覆盖空班级、同分和去极值人数不足。
- 购物车:用店铺 ID 与商品 ID 作为身份,用 Map 合并数量,金额用 BigDecimal;验证同店同商品合并、不同店铺分开、折扣门槛。
- 文件整理工具:筛选指定后缀,保留相对层级,按字节复制;验证空目录、同名文件、目标位于源内和复制失败时源数据保留。
- 并发账户:多个任务操作同一个账户,明确等待完成与线程池退出;确认无丢失更新、余额不变量成立、失败能被观察。
- 文本上传:客户端按约定编码发送,服务端处理并保存后回执;验证 EOF 协议、中文、唯一文件名、超时与失败回执。
每次复习挑一个综合练习,不看参考代码重新实现。把输入、输出、边界和失败状态写清,再编写针对这些约定的验证。