简介:这份资源是河北工业大学Java期末考试复习题文档,面向该校计算机相关专业学生,尤其适合考前系统梳理与查漏补缺。内容围绕Java核心知识点,覆盖常见题型与复习重点,可用于检验对Java语法、面向对象、集合框架、异常处理等模块的掌握程度,帮助考生快速定位薄弱环节并进行针对性强化。文档为doc格式,共1个文件,大小约68KB,轻量便携,便于打印或电子阅读。目前已有285人学习浏览,是该校Java课程复习资料中较受关注的推荐文档。借助这份复习题,读者能了解期末考试的大致题型与命题思路,对照题目自测,结合部分参考答案校正理解偏差,进而提升应试信心与复习效率;对准备期末冲刺或平时阶段自测的同学均有参考价值。
1. 某高校Java期末复习题:一份选择题题库值不值得刷
期末复习季,一份顶着某高校Java期末复习题名头的选择题文档,在同学之间传来传去。我拿到手翻完,第一反应是:这不像复习资料,更像一张考点地图。二十多道选择题,从平台无关性、访问修饰符一路考到布局管理器,每一道题背后都对应着期末考最常出现的知识点;虽然答案只标了少部分,但配合 IDE 跑一跑,反而比背标准答案记得更牢。这份资料适合两类人:一类是刚学完 Java、想考前把选择题分数兜住的同学;另一类是已经能写小项目、但理论题容易翻车的从业者——选择题恰恰是机房考试里最容易拉开差距的部分。
2. 先看货再动手:题目覆盖范围与考点权重的拆解
2.1 文档内容的实际构成
这份 doc 打开后,前面先是一大段跟 Java 完全无关的英文模板文本,夹杂着一些条款式的政治学习内容,明显是某个组织内部材料没删干净就合并进了文档。这不算罕见,学校资料在流传过程中经常被各种剪贴、合并,我习惯性跳过那段,只看从“一、选择题”开始的部分。
真正的题目部分以单选为主,一共 25 道,题号从 1 排到 25,但其中有重复:第 14 题和第 25 题几乎一模一样,都在问“修饰符混用的说法,错误的是”。这说明文档不是一次性生成的,而是从几套卷子或者几份作业里拼出来的。拼题有个好处:覆盖面广;也有个坏处:题与题之间的难度波动大,前后有重复。对复习来说这不是坏事,重复出现反而提示了这组知识点的重要程度。
从题序上看,出题基本顺着教材章节往下走:
- 第 1~3 题,Java 语言特点、关键字、赋值语句,属于第 1、2 章基础语法;
- 第 4~6 题,类声明、方法返回类型、继承,进入面向对象;
- 第 7~8 题,异常处理,try/catch/finally 与多重 catch 排序;
- 第 10~16 题,构造方法、静态方法、访问控制、字符串比较和默认值;
- 第 17~18 题,接口和接口常量;
- 第 19~20 题,类型转换、Scanner 包位置;
- 第 21~24 题,Java 网络支持、编译命令、访问权限、容器布局;
- 第 25 题,又是修饰符混用。
所以这份题其实覆盖了 Java 期末考试的大部分选择题命题范围,从语法到类库到 GUI 布局都有涉及。但它没有涉及泛型、集合框架、多线程编程、IO 流这些“大题热点”,说明出题老师把那些内容留给了编程题或简答题。
2.2 高频考点与分值倾向:一张表看清
我把 25 道题按考点归了一下类,做成下面这张表,方便你做重点投入的决策。
| 考点主题 | 涉及题号 | 考察意图 |
|---|---|---|
| 语言特性 | 1、21、22 | 平台无关性、TCP/IP 支持、编译命令 |
| 关键字/语法 | 2、3 | 关键字识别、赋值语句合法性 |
| 类与对象创建 | 4、5、10 | 类声明、无返回值方法、构造方法 |
| 继承与访问权限 | 6、13、23 | 子类继承范围、默认/private/protected 权限 |
| 修饰符组合 | 11、14、25 | static/abstract/final/private 的搭配约束 |
| 异常处理 | 7、8 | try-finally、多重 catch 顺序 |
| 字符串与默认值 | 15、16 | equals 与 ==、成员变量默认值 |
| 接口 | 17、18 | 接口实现、接口常量 |
| 类型转换 | 19 | 强转的信息丢失 |
| 常用类与GUI | 20、24 | Scanner 包名、Panel 默认布局 |
从这张表能看出三件事。第一,面向对象相关(继承、修饰符、接口、构造方法)加起来占了将近一半的分值,这是选择题的重头戏,复习时不能只看概念,得把“谁在什么前提下能访问谁”这类关系理清。第二,送分题大约有五六道,比如关键字识别、Scanner 包位置、javac 命令,这些题一旦背过就不该丢分。第三,异常处理和字符串比较各只出现一两道,但都是经典的变形题,每次考试都有人在这类题上翻车,值得单独拎出来过一遍。
2.3 参考答案的可用程度
文档标题里写着“部分答案”,实际情况也是如此。第 1 题明确标了答案 C,后面的题基本没有标注,部分选项之间空格错乱、符号缺失,说明是排版时没处理干净。这里有个现实问题:如果直接拿这份 doc 去背,你只能靠自己的判断确认答案对错,判断错了,背的就是错题。
我的习惯是给每一道题的每个选项写注释:正确的选项写原因,错误的选项写为什么错。选择题的考点其实很固定,错误选项往往是在“继承范围”“访问权限”“默认值”这三个维度上做小改动,你把每个错误选项的原因也标记出来,才算真正吃透了这道题。
3. 高频考点逐题拆解:继承、接口、异常的命题套路
3.1 送分题里的坑:平台无关性、关键字与赋值语句
第 1 题问 Java 语言与其他语言相比独有的特点,答案是“平台无关”。A 项的面向对象不是 Java 独有,C++ 也有;B 项的多线程也不是,C++ 通过线程库也能实现;只有“平台无关”是 Java 通过 JVM 字节码机制和其他语言拉开差距的标志性特点。这道题几乎每年都考,属于纯概念题,但命题老师喜欢在题面加“独有”两个字,让粗心的同学把 C++ 也有的特性选进去。
第 2 题问哪个不是关键字。default 是关键字,abstract 和 package 也是,只有 number 不是。这道题有个隐藏考点:Java 没有 number 这个关键字,但初学者经常从其他语言带过来这个习惯,看到 number 就想当然地认为它是关键字。第 3 题是赋值语句合法性判断,Java 里赋值运算符左边必须是变量,x+1、i++、a++b 都不能作为左值,只有 x+=1 合法。这类题没有技巧,就靠平时写代码时对语法的敏感度。
这三道题的共同特点是:单独拿出来都很简单,但组合在一起考时,会有人因为“看着眼熟”而选错。我做这套题时,第 3 题的 C 选项“a++b=1”一眼就感觉别扭,但如果不逐项检查,很容易被 A 选项的“x+1=5”误导——这两个选项都是非法赋值,只是错误的姿势不同。
3.2 继承与访问修饰符:子类能拿到什么,取决于权限修饰符
第 6 题是经典的继承题:子类到底能继承父类的什么?答案是 B,子类继承父类的非私有方法和状态。A 项说“所有方法和状态”不对,因为 private 成员不会被子类继承;C 项说“只能继承 public 方法和状态”太窄,漏掉了 protected 和默认权限的情况;D 项说“只能继承方法”忽略了状态(成员变量)也可以被继承。
这里有个容易混淆的点:继承和访问是两件事。private 成员在技术语义上“不被继承”,但子类对象在内存里仍然包含父类的私有部分,只是子类代码没有权限直接访问它。考试不会考到这个层面,但如果你做工程时用反射去访问父类私有字段,就会发现它们其实还在。理解到这一层,再看第 23 题就顺了:类的成员访问权限设置为默认,则同一包中的类可以访问。默认权限也叫包私有权限,它比 private 宽松、比 protected 严格。
第 13 题考的是类级别的访问控制:让某个类能被同一个包中的其他类访问,但不能被包外的类访问,应该怎么办?答案是什么都不加,使用默认访问权限。注意这里的默认权限是针对“类”,类和类成员的默认权限一样,都是包内可见。很多人会把“类只能用 public 或默认”记混,实际上顶层类不能用 private 和 protected 修饰。
3.3 异常与多重 catch:Exception 必须排在最后
第 7 题问能单独和 finally 语句一起使用的块,答案是 try。try-finally 是一个合法组合,catch 可以省略。这种写法在资源释放场景里很常见,比如手动关流的时候,try 块里执行操作,finally 块里做清理,不用 catch 捕获异常,让异常向上抛。
第 8 题是异常部分的经典陷阱题:多重 catch 中,当 ArithmeticException、NumberFormatException、Exception、ArrayIndexOutOfBoundsException 同时出现时,哪一个应该最后列出?答案是 Exception。原因很简单:catch 块是按顺序匹配的,一旦 Exception 放在前面,它会把后面所有的子类异常全部接住,后面的 catch 块永远不会执行,编译器直接报“已捕获的异常”错误。所以多重 catch 的排序规则是:子类异常在前,父类异常在后,Exception 永远做兜底。
我平时写代码时会刻意把这个顺序当作硬性规范来执行,因为即便编译器能拦住错误,把 Exception 放前头也意味着你放弃了针对具体异常做差异化处理的可能。比如你本来想在 ArithmeticException 里做除零的特殊提示,结果被 Exception 统一拦了,用户看到的就只有一行“程序出错”,排查问题时很被动。
3.4 构造方法与默认值:void、无参构造、成员变量初始化的组合题
第 5 题:如果类的方法没有返回值,该方法的返回类型应是什么?答案是 void。很多人会在 null 和 void 之间犹豫,null 是引用类型的字面量,不是返回类型;abstract 和 default 更不是。第 10 题问每个类都定义的方法是什么,答案是构造方法。注意措辞是“每个类都有”,不管你有没有显式写,编译器都会提供一个默认无参构造方法。
第 16 题是一道组合题,考成员变量默认值和对象创建:
public class Demo { int x = 1; int y; public static void main(String args[]) { int z = 2; Demo t = new Demo(); System.out.println(t.x + t.y + z); } }输出结果是 3。关键在于 y 是成员变量,没有显式初始化时默认值为 0;x 是 1,z 是 2,三者相加得 3。这道题的陷阱隐藏在“t.x + t.y + z”这个表达式里,如果你把 y 理解成局部变量,就会觉得它没初始化、编译不过。实际上成员变量和局部变量的初始化规则不同:成员变量有默认值,局部变量没有,局部变量不赋值直接用会报编译错误。
这道题值得多说一句,期末考试把“成员变量默认值”和“对象创建”绑在一起考,是因为这两个知识点在代码里经常一起出现。很多人写类时不习惯给成员变量赋初值,直接依赖默认值,这在简单场景下不出问题,但在多线程或复杂初始化顺序下就会变成黑匣子。我的建议是:考试按默认值记,写代码时显式初始化。
3.5 类型转换与常用类:信息丢失、Scanner 包名、面板默认布局
第 19 题问会产生信息丢失的类型转换。答案 B 是 int a = (int) 8846.0。8846.0 是 double 类型,强转成 int 会把小数部分丢掉。A 项 float a = 10 是 int 赋值给 float,float 范围比 int 大,不会丢;C 项 byte a = 10; int b = -a,先取负再赋值给 int,没有精度变化;D 项 double d = 100 是 int 到 double 的自动拓宽,也不丢。做这类题时,只要记住一句话:小范围转大范围安全,大范围转小范围可能丢,浮点转整数必丢小数。
第 20 题问 Scanner 类在哪个包中。答案是 java.util,不是 java.lang。初学者容易把 Scanner 记到 java.lang 里,因为 System 和 String 都在 java.lang,但那是不需要 import 的包。Scanner 必须显式 import java.util.Scanner 才能用。第 22 题考编译命令,javac.exe 是编译器,java.exe 是解释器,这个顺序错了就什么都跑不起来。
第 24 题考 Panel 容器的默认布局,答案是 FlowLayout。Button、TextField 这类组件在 Panel 里默认从左到右排,一行放不下自动换行。很多人会把 Panel 的默认布局和 Frame 的默认布局(BorderLayout)搞混。Frame 是 BorderLayout,Panel 是 FlowLayout,这两个是 GUI 选择题里最高频的搭配。
4. 背题避坑:五个最容易记反的考点与排查思路
4.1 现象:s1.equals(s2) 和 s1 == s2 的输出分不清
第 15 题里,String s1 = new String("xyz"),String s2 = new String("xyz"),equals 比较的是内容所以是 true,== 比较的是引用地址所以是 false,输出 true false。很多同学背了“equals 比较内容、== 比较地址”,一到 String 上就开始怀疑:String 不是有常量池吗?两个 new 出来的对象地址肯定不同,这道题选 A。真正容易翻车的是把 s1 和 s2 改成 String s1 = "xyz"; String s2 = "xyz"; 那 == 的结果就是 true,因为指向常量池同一个对象。做题时先看有没有 new,再看有没有用 equals,两步走能避免大多数误判。
4.2 现象:参考答案只有第 1 题标了 C,其他题对不上
这份文档的真相是“答案部分缺失”。如果只背第 1 题的答案,其他题靠自己猜,很容易把错误选项记成正确答案。解决方法是每道题都自己写一遍逻辑,再找一块地方验证。第 8 题的答案 Exception、第 15 题的 true false、第 24 题的 FlowLayout,这些都可以用 IDE 或命令行快速验证,花不了两分钟,比背一个“可能来自某届学长”的答案可靠得多。
4.3 现象:把“子类能继承父类的所有方法”当成正确说法
第 6 题的 A 选项就是这句话,但它不对。Java 的继承对 private 成员是“不可见”,不是“可继承”。我看到不少人把“继承”理解为“全部拿到手”,做题时看到“所有”两个字就选。排查思路是:凡是在继承题里看到“所有”这个词,先想 private;凡是在访问控制题里看到“默认”,先想包内可见。这两个词是命题老师最爱的陷阱。
4.4 现象:接口题里 i = a1.k 的结果拿不准
第 18 题,接口 B 定义 int k = 10,实现类 A 的对象 a1 访问 a1.k,结果是 10。接口里的字段默认是 public static final,所以 k 本质上是常量,可以通过接口名 B.k 访问,也可以通过实现类对象 a1.k 访问。这个题大家容易倒在“接口字段不是应该通过接口访问吗”这层疑问上——实际上通过实现类对象访问也合法。真正需要注意的反而是:接口常量一旦定义就不能被实现类修改,试图给 k 重新赋值会直接编译报错。
4.5 现象:布局管理器默认值记混,把 Panel 和 Frame 搞反
Panel 默认 FlowLayout,Frame 默认 BorderLayout。这组对比在填空题里也常出,答题时优先记 Frame 的特殊性:它是顶层窗口,只有它默认用 BorderLayout。Panel 是普通容器,组件往里丢的时候默认从左往右排。还有一个联系记忆方法:BorderLayout 把区域分成五块、适合窗口缩放,FlowLayout 适合面板内简单排列,各司其职。
5. 把复习题变成复习闭环:两遍刷题法与错题自测清单
5.1 第一遍盲做:给每道题做四色标记
不要一上来就对着文档的“部分答案”逐题核对。先把题目独立做一遍,每道题在题号前标记一个符号:确定对、确定错、蒙对、完全不会。这四类标记决定了你后续的投入精力。确定对的一扫而过;蒙对的和完全不会的是重点,因为你考试时遇到类似题仍然会丢分。
这份 doc 里适合盲做的题大约 20 道,做完一遍大概需要半小时。做的时候别翻书,别查 API,尽量还原考场状态。特别是第 2、3、6、15、16 这几道题,它们是整份卷子里最容易“看着眼熟、一做就错”的题。
5.2 第二遍验证:把疑惑题变成最小代码
盲做之后,把你标记为“蒙对”和“完全不会”的题,挨个转成最小代码片段,跑一次看真实输出。下面是一个综合验证示例,覆盖第 6、15、16、18 题涉及的核心行为:
// 验证四个高频易错点:继承范围、字符串比较、默认值、接口常量 class Parent { public int pub = 1; // public 成员,子类可访问 protected int pro = 2; // protected 成员,子类可访问 private int pri = 3; // private 成员,子类不可直接访问 public int getPri() { return pri; } } interface ConstHolder { int k = 10; // 接口字段默认 public static final } class Child extends Parent implements ConstHolder { public int sumAll() { return pub + pro + getPri(); // 通过 public 方法间接访问私有字段 } } public class VerifyDemo { public static void main(String[] args) { Child c = new Child(); System.out.println("sumAll=" + c.sumAll()); // 6 System.out.println("c.k=" + c.k); // 10 String s1 = new String("xyz"); String s2 = new String("xyz"); System.out.println("equals=" + s1.equals(s2)); // true System.out.println("===" + (s1 == s2)); // false int x = 1; int y; // 成员变量默认值为 0 Child c2 = new Child(); int z = 2; System.out.println(c2.hashCode() > 0); // true,对象已创建 } }这段代码把继承访问范围、接口常量、字符串比较、成员变量默认值用一个类串起来了。逻辑说明:Child 继承 Parent 的非私有成员,通过 getPri() 间接访问私有字段;接口字段 k 默认为 public static final,所以对象可以直接访问;equals 比较字符串内容,== 比较引用;y 虽然没初始化,但作为成员变量有默认值 0。参数说明:如果你想验证“private 成员能不能被继承”,把 sumAll() 改成直接返回 pri,编译器会当场报错——这比背任何结论都直观。
命令行编译运行:
javac VerifyDemo.java java VerifyDemo预期输出三行:sumAll=6、c.k=10、equals=true、===false。实际跑出来的结果和预期不符时,说明你对某个知识点的理解有偏差,对照输出逐行定位即可。这种“写代码验证概念”的习惯,比反复背题有效得多。
5.3 错题转问答题:预防简答与填空
选择题做对了,不等于知识点过关。期末考试除了选择题,通常还有简答题或填空题。把做错过的题改写成问答题自测,是性价比很高的一步。比如做错第 8 题,就把题目改成“为什么多重 catch 中 Exception 必须最后列出”;做错第 23 题,就改成“默认访问权限和 protected 有什么区别”。改完后自己口头复述一遍,能流畅讲出来才算真正掌握。
一个可复用的自测表格:
| 原题号 | 错误知识点 | 改写的自测问题 | 复述是否流畅 |
|---|---|---|---|
| 8 | 异常匹配顺序 | Exception 为什么必须放在最后 | 是/否 |
| 15 | 字符串比较 | new String 和常量赋值的 == 区别 | 是/否 |
| 24 | 布局管理器 | Panel 和 Frame 的默认布局各是什么 | 是/否 |
| 19 | 类型转换 | 哪些转换会有信息丢失,为什么 | 是/否 |
把这张表存在笔记里,考前只看自测问题,不看答案。能流利答出来的划掉,答不出来的回头翻错题——这比通篇重刷整份卷子省时间得多。
6. 进阶验证:把选择题改写成最小可运行 Demo
当你把这 25 道题都过完、错题都验证过之后,可以做一个更进阶的练习:把整份卷子的核心考点压缩成一个可运行的类,命名成 ExamReviewDemo,把每个考点的预期结果写进 main 方法里,通过调整代码让程序“自己考自己”。这样做的好处是,你在复习阶段就把这些知识融进了一个实实在在的项目骨架里,而不是停留在“看过、背过”的层面。
下面是我复现这套题时留下的一个压缩版 Demo,覆盖继承、接口、静态方法、默认值、字符串比较、异常顺序六个高频考点:
// 压缩版考点验证:继承/接口常量/静态方法/默认值/字符串/异常顺序 interface IBase { int CONST = 88; // 接口常量:public static final } class Base { int num; // 成员变量默认值 0 static void hello() { // 静态方法:不依赖对象 System.out.println("hello from Base"); } } class Derived extends Base implements IBase { void printNum() { System.out.println("num=" + num); // 输出 0 System.out.println("CONST=" + CONST); // 输出 88 } } public class ExamReviewDemo { public static void main(String[] args) { Derived d = new Derived(); d.printNum(); Derived.hello(); // 静态方法可用类名调用 String a = new String("java"); String b = new String("java"); System.out.println(a.equals(b)); // true System.out.println(a == b); // false try { int[] arr = new int[2]; System.out.println(arr[5]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("caught ArrayIndexOutOfBoundsException"); } catch (Exception e) { System.out.println("caught Exception"); } } }运行后的输出依次是 num=0、CONST=88、hello from Base、true、false、caught ArrayIndexOutOfBoundsException。如果把上面 catch 的顺序反过来,把 Exception 放在第一个 catch,编译器会直接告诉你“异常已经被捕获”。这个 Demo 把卷子里最容易记混的五个点全部串起来了,而且每次运行都在替你复查一遍记忆。
跑完这个 Demo,我的习惯是再回头把这份 doc 里的 25 道题重新盲做一遍,看标记为“蒙对”的题有没有变成“确定对”。如果还剩下两三个不确定的,就针对那几道题补一轮验证。从那以后,我每次期末复习都把“选择题转代码、代码跑一遍、输出与预期对照”这个流程强制走一遍,理论题丢分率明显降下来了。这份资料本身答案不全,但用对了方法,反而比直接背答案更能帮你建立可靠的判断力——希望帮到你。
本文还有配套的精品资源,点击获取