☰
Java SE 17认证1Z0-829练习测试考点与错题复盘
2026/10/28 21:11:02 网站建设 项目流程

简介:面向 Java SE 17 认证备考者的实战练习 PDF,对应 OCP 1Z0-829 考试,适合已具备一定 Java 基础、希望通过模拟测试查漏补缺并熟悉考试主题与题型的中高级开发者。内容围绕认证考点组织,包含大量练习题、解析思路与复习策略,可用于阶段性自测、定位薄弱模块,再结合错题回顾语法、API 与程序设计相关概念,也可借助成套题目训练答题节奏。资源包共 1 个 PDF 文件,大小约 20.96MB,单文件便于在电脑或平板上查阅,也方便按章节打印练习。目前已有 268 人学习,说明其在认证备考群体中具有一定参考价值。对准备正式考试的人来说,可按解析理解错误原因,把复习策略落到每日计划中,提升备考的针对性与完整度。

1. 练习测试的第一道坎:一行代码问输出,错的人最多

Java SE 17 认证(1Z0-829)的练习测试里,真正拉分的不是最后那个长到看不清的 Stream 综合题,而是开篇那种只有三行的代码题:给一个var、一个自动装箱、一个字符串拼接,问打印什么。很多人做完觉得稳了,对答案才发现错在Integer的缓存区间、错在+=的隐式窄化、错在Arrays.asList()到底能不能add。这类题不考你会不会写框架,只考你对语言默认行为的熟悉程度,而默认行为恰恰是工作三年后最容易被 IDE 惯坏的地方。

这场考试的核心是「读代码 + 判断行为」,不是「写代码」。50 道题、90 分钟、及格线在 68% 上下,意味着你只要能稳定判断出「这段代码能不能编译」「输出是什么」「第几行抛异常」,就已经过线。它适合已经能写业务代码、但没系统梳理过 Java 17 新特性和边角语义的人——尤其是那些平时靠 IDE 补全、靠搜索引擎续命的开发者,练习测试会把你所有的模糊地带一次性照出来。

2. 分值地图:11 个考试域里,56% 的题集中在五个板块

2.1 权重表:哪些域决定你能不能过

先把分值看清楚,再决定力气往哪使。下面这张表按公开的域权重整理,数字是量级参考,不要当成精确到个位数的承诺,但用来排优先级足够。

考试域(简化表述)大致权重卷面题量感受优先级
面向对象:继承、接口、枚举、record、sealed20%8~10 题第一档
日期时间、文本、数值与布尔值11%5~6 题第一档
数组与集合10%5 题第一档
Stream 与 Lambda8%4~5 题第一档
异常处理7%3~4 题第一档
打包部署与模块系统8%4 题第二档
并发执行7%3~4 题第二档
Java I/O6%3 题第二档
控制流程5%2~3 题第三档
JDBC5%2~3 题第二档
本地化4%2 题第三档

把 68% 换算成题量,50 题里对 34 题就过。第一档五个域加起来接近 56%,也就是 28 题左右;第二档四个域约 26%。这道算术题的价值在于:第一档全对、第二档对一半,你已经稳稳过线,第三档就算全错也不影响。反过来,如果第一档丢了 5 题以上,后面怎么蒙都救不回来。

2.2 三档优先级:必拿、记模板、能认就行

第一档是「必拿」,标准是零失分。面向对象那 20% 的题,考的全是规则边界:重写能不能降低可见性、record 能不能声明实例字段、sealed 的子类必须是什么形态。这些没有推理空间,只有记没记住。日期时间那 11% 更划算,题型高度固定,Period和Duration能不能混用、格式化串里MM和mm谁是谁,背下来就是白送的分。

第二档是「记模板」,模块化、并发、I/O、JDBC 各有一套固定问法。模块化基本就问exports和opens的区别、requires transitive的效果、provides...with的顺序;JDBC 基本就问参数索引从几开始、next()要不要先调、autoCommit默认值。这类题不需要你真的写过模块化项目,把模板记熟、把顺序记对就行。

第三档是「能认就行」,控制流程和本地化。控制流程里的for、while、switch语法你天天在用,唯一要注意的是带标签的break和continue,以及switch表达式的穷尽性要求。本地化就两道题,ResourceBundle的查找顺序和Locale相关的格式化,考前一周集中看一遍就够。

2.3 复盘方法:错题必须分成四类

刷练习测试最容易犯的错是「对完答案就翻篇」。一套卷子 50 题错 12 题,如果你只是把正确答案抄一遍,下一套还会错同样的地方。有效的做法是把每道错题归到四类里,不同类走不同处理路径。

第一类是知识空白,比如根本不知道record有紧凑构造器。处理方式是回到对应的知识块补,补完立刻找三道同类题验证。第二类是看漏条件,题目问「哪个不正确」,你选了正确的那个。这类错跟知识无关,跟读题习惯有关,处理方式是在题干上画圈,把「不正确」「除了」「编译失败」这几个词标出来再答。

第三类是语言细节,比如隐式类型提升、默认值、装箱缓存。这类错最隐蔽,因为你「以为」自己会。处理方式是建立一张个人易错清单,每条只写一行,考前反复看。第四类是时间不够,最后五题靠蒙。处理方式不是提速,而是调整做题顺序——先扫一遍,把长代码题标记出来放后面,先吃掉概念题和短代码题。

提示:错题本不要记题目本身,记「我为什么会往那个方向想」。同样一道List.of的题,你错的原因可能是「以为它跟Arrays.asList一样」,把这个误解写下来,比抄十道题有用。

2.4 真题演练:一道题三种问法,答法完全不同

练习测试里同一段代码会以三种面目出现,问法变了,答题路径也得变。看这段代码:

import java.util.*; public class Fixed { public static void main(String[] args) { var list = Arrays.asList("a", "b"); // 返回固定长度的 List list.set(0, "c"); // 第 1 处 list.add("d"); // 第 2 处 System.out.println(list); // 第 3 处 } }

第一种问法:「输出是什么?」正确答案是「运行期抛UnsupportedOperationException」。第二种问法:「哪一行导致编译失败?」答案是「没有,全部能编译」。第三种问法:「把第 1 处删掉后输出是什么?」答案是[a, b]后面接异常——因为add照样抛。

答题路径要按问法切换。问输出,就先找运行期异常点;问编译,就只查类型和语法,别去管运行时行为;问「哪一行先出问题」,就从第一行开始逐行判断副作用。很多人在这道题上翻车,是因为把Arrays.asList和List.of记混了:前者允许set、禁止增删、允许null;后者连set都不允许,也不允许null。这两个 API 一个在java.util.Arrays,一个在List接口上,长得像,脾气完全不同。

3. 语言与 OOP:var、继承、record、sealed、异常的五组必考题

3.1 var 的四条硬规则和数值提升的坑

var的考点非常集中,四条规则记牢基本不丢分:只能用于局部变量(包括for循环变量、增强for、try-with-resources 资源);必须在声明时初始化,不能写var x;;不能用于方法参数、返回值、字段、构造器参数;不能用来接null,因为推不出类型。还有一条容易忽略的:Lambda 的参数不能「一部分写var一部分写具体类型」,要写就全部写或者全部不写。

数值提升是另一片雷区。整数字面量默认是int,long要加L,float要加f。复合赋值运算符自带隐式窄化,所以short s = 1; s += 1;能编译,而s = s + 1;编译失败,因为右边提升成了int。这道题在练习测试里出现的频率高得离谱,答题时只问自己一句:右边表达式的类型是什么,左边能不能接住。

byte b = 10; b = b + 1; // 编译错误:int 不能赋给 byte b += 1; // 合法:复合赋值自带强制转换 long x = 1_000_000_000 * 2; // 先按 int 算,溢出,再赋给 long long y = 1_000_000_000L * 2; // 正确写法

第二行和第四行是同一类陷阱:先算右边,再看左边。1_000_000_000 * 2两个操作数都是int,结果按int算已经溢出,赋给long也救不回来。看到长数字和乘法挨在一起,先数一数有没有L。

3.2 继承与方法重写:五个必查点

重写规则题几乎每套卷子都有,答题时按五个点依次过一遍,能挡掉九成的错。第一,可见性不能降低,public不能被重写成protected。第二,返回类型可以协变,父类返回Number,子类返回Integer合法。第三,不能抛更宽的检查异常,父类不抛,子类就不能抛IOException。第四,static方法只能被隐藏不能被重写,@Override加在static方法上会编译失败。第五,final方法不能被重写,final类不能被继承。

构造器执行顺序是另一道必考题,而且答题时不能靠猜,得按固定顺序走:父类静态块 → 子类静态块 → 父类实例初始化块 → 父类构造器体 → 子类实例初始化块 → 子类构造器体。静态块只执行一次,所以创建第二个对象时不会重复打印。

class A { static { System.out.print("A静态 "); } { System.out.print("A实例 "); } A() { System.out.print("A构造 "); } } class B extends A { static { System.out.print("B静态 "); } { System.out.print("B实例 "); } B() { super(); System.out.print("B构造 "); } } new B(); new B();

输出是A静态 B静态 A实例 A构造 B实例 B构造 A实例 A构造 B实例 B构造。注意B()里的super()是显式写的,写不写效果一样,编译器要求它必须是第一句。如果B的构造器里先写了一句System.out.print,再写super(),直接编译失败——这条规则考得很勤。

3.3 records:紧凑构造器和三个「不能」

record是 Java 17 的重点,考点集中在「能做什么」和「不能做什么」的边界上。能做的:声明静态字段和静态方法、实现接口、重写自动生成的访问器、定义额外方法、写紧凑构造器、定义多个构造器(但最终必须委托到规范构造器)。不能做的:声明实例字段、继承其他类(它已经隐式继承java.lang.Record)、把某个组件声明成可变引用后还指望它不可变。

紧凑构造器是高频考点,很多人不知道里面可以给参数重新赋值,而且赋值结果会写进字段。

record Ticket(String code, int seat) { Ticket { // 紧凑构造器:不写参数列表 code = code.toUpperCase(); // 合法:参数重新赋值,最终写入字段 if (seat < 1) seat = 1; // this.code = code; // 编译错误:紧凑构造器里不能给字段赋值 } Ticket(String code) { this(code, 1); } // 额外构造器必须委托 } System.out.println(new Ticket("a1", -5));

输出是Ticket[code=A1, seat=1]。这里有两个知识点同时被考到:一是紧凑构造器里改的是参数不是字段,改完会自动赋值给字段;二是record的toString()格式固定为类名[字段1=值1, 字段2=值2],字段顺序跟声明顺序一致。如果题目让你「在紧凑构造器里把this.code赋成大写」,那是个错项,选它。

访问器名字也常考:组件叫code,访问器就叫code(),没有get前缀。重写访问器是允许的,比如public int seat() { return Math.max(seat, 1); }能编译,但这样一来toString()用的还是字段原值,两者会不一致——这种「能编译但语义怪」的选项,往往就是正确答案。

3.4 sealed:permits 和子类的三种形态

sealed的题只有一个核心:被permits的子类必须明确表态,要么final(到此为止),要么sealed(继续限制),要么non-sealed(重新开放)。三个关键字缺一个就编译失败,尤其是non-sealed里那个连字符,漏了就是另一个标识符。

sealed interface Shape permits Circle, Square {} record Circle(double r) implements Shape {} // record 隐式 final,合法 final class Square implements Shape { /* ... */ } // 显式 final,合法 // class Triangle implements Shape {} // 编译错误:没有表态

还有两条容易忽略的规则:子类必须和父类在同一个模块里,如果没有用模块,就必须在同一个包里;如果所有子类都写在同一文件里,permits可以省略。练习测试喜欢给一个「子类在另一个包里」的选项让你判断,答案是不能编译。

3.5 instanceof 模式匹配与 switch 表达式的边界

instanceof的模式变量作用域是必考细节,规则只有一条:变量在「确定匹配成功」的分支里才可见。配合&&时右侧可见,配合||时右侧不可见,取反之后也不可见。

Object o = "hello"; if (o instanceof String s && s.length() > 3) { System.out.println(s.toUpperCase()); // 合法,s 在 && 右侧可见 } if (!(o instanceof String t)) { return; } System.out.println(t.length()); // 合法:提前返回后 t 确定有值

第二段用到了「提前返回让模式变量流出 if」的技巧,这个写法在练习测试里出现过,很多人以为t出了if就失效,其实只要控制流保证走到后面时一定匹配成功,变量就还在作用域里。

这里必须划一条线:Java 17 的考试范围里,switch的模式匹配还是预览特性,不作为考点;但switch表达式(箭头写法、yield、返回值)是正式特性,一定考。如果你拿 Java 21 的资料来复习,很容易把case Circle c ->当成必考题,结果浪费大量时间。判断标准很简单:题目里出现case 类型 变量名,那多半是超出了范围,或者它本身就是个错项。

int x = 2; String r = switch (x) { case 1 -> "one"; case 2 -> { yield "two"; } // 多语句必须用块 + yield default -> "many"; // int 的 switch 表达式必须有 default };

switch表达式用在enum上时,如果覆盖了全部常量,可以省略default;用在int、String上时必须写default,否则编译失败。这个区别几乎每套卷子都考。

3.6 异常与 try-with-resources:关闭顺序和抑制异常

异常部分的题集中在三处。第一处是catch的顺序,子类异常必须写在父类前面,写反了编译失败。第二处是多重catch的变量隐式final,不能在块里重新赋值。第三处是 try-with-resources 的关闭顺序,资源按声明的反序关闭。

class Res implements AutoCloseable { private final String name <p> <a href="https://download.csdn.net/download/weixin_42612405/90828696" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询