简介:本资源为河北工业大学Java期末考试复习题汇编,面向本校本科生及备考Java课程的考生,用于考前梳理重点、查漏补缺,也适合自学Java者检验对基础语法、面向对象、异常处理等核心知识点的掌握程度。压缩包仅含1个doc文档,整体大小68KB,内容以复习题为主,部分题目附有参考答案,便于对照练习和知识点巩固。已有285人学习下载,适合在考前冲刺阶段使用,可帮助读者快速定位高频考点,熟悉常见题型与作答思路,提高复习效率。
1. 一份带部分答案的Java期末复习题文档,正确的打开方式是什么
期末复习最怕的不是题难,而是手里那份Java复习题文档的答案只有一半。很多人的第一反应是“答案不全没法用”,我的判断恰好相反:部分答案的复习题,比全答案文档更适合考前冲刺。原因很简单,全答案容易让你产生“看一遍就会了”的错觉,而缺失的答案恰好逼着你动手补全,补全的过程才是真正记住知识点的过程。
这份文档解决的是三个问题:这门课的期末到底考什么、常见题型长什么样、答案不全时怎么复习才不慌。适合考前一到两周想快速过考点的人,也适合想用做题代替翻书的初学者。接下来我把这类文档拆成三类题型来讲——选择题、程序阅读题、编程题,每一类给出具体的复习动作和参数取舍,最后单独讲几个我踩过的坑。
2. 选择题复习:把考点的“识别特征”练成条件反射
选择题是这类复习题文档里占比最大的部分,也是最容易靠刷题拿分的地方。选择题不考你写代码,考的是你能不能认出错误写法、能不能区分易混概念。所以复习选择题的正确目标不是“背答案”,而是建立一套快速识别考点的判断规则。
2.1 修饰符、集合、异常:选择题的三大固定出题区
Java期末选择题的出题范围翻来覆去就是几块:访问修饰符、集合框架、异常体系、String与StringBuilder、基本类型与包装类型。其中前三个是绝对高频区,尤其要注意它们各自埋坑的方式。
访问修饰符的题最爱考四个点:protected跨包访问到底行不行、default修饰符能不能修饰局部变量、static方法能不能访问实例变量、final类能不能被继承。前两个是重灾区。protected的真实语义是“同包或子类可访问”,但子类跨包访问父类protected成员时,只能通过子类自己的引用去访问,不能通过父类引用去访问,这个细节选择题里经常包装成很长的场景题。
集合框架的题爱考的是:ArrayList能不能存null、HashMap和Hashtable对null键的处理差异、ArrayList和LinkedList在中间插入时的性能差异、HashSet去重的判定规则。这些点很多人靠死记,但我的建议是每个点都写两行代码跑一遍,因为集合相关考点的记忆必须建立在“见过运行结果”的基础上,光背结论很容易在变形的选项里翻车。
异常体系的题也有固定套路:受检异常(IOException、SQLException)不捕获或声明能不能编译通过、运行时异常(NullPointerException、ArrayIndexOutOfBoundsException)需不需要强制处理、finally块里return会不会覆盖try里的return。最后一个点是阅读题和选择题双料考点,值得单独花时间。
2.2 用带注释代码自测:把选择题变成判断题
复习选择题时,我一般会把文档里的高频考点改写成一小段可运行代码,然后不看输出结果,先在纸上写出自己认为的输出或结论,再用IDE验证。这样等于把选择题重新变回了判断题,逼着自己对每个考点表态。
import java.util.*; public class ChoiceQuiz { public static void main(String[] args) { // 考点1:ArrayList 允许存 null,而且可以连续 add(null) ArrayList<String> list = new ArrayList<>(); list.add(null); list.add("java"); System.out.println(list.size()); // 先猜:输出是 1 还是 2? // 考点2:HashMap 允许 null 键,Hashtable 不允许 HashMap<String, Integer> map = new HashMap<>(); map.put(null, 1); map.put(null, 2); System.out.println(map.size()); // 先猜:null 键被覆盖后 size 是几? // 考点3:StringBuilder 是可变对象,传参后原对象内容改变 StringBuilder sb = new StringBuilder("期末"); appendTest(sb); System.out.println(sb); // 先猜:输出“期末”还是“期末复习”? } static void appendTest(StringBuilder s) { s.append("复习"); } }这段代码覆盖了三个选择题高频考点。第一题的输出是2,因为ArrayList没有对元素做非空校验,add(null)只是把一个空引用放进了数组;第二题的输出是1,第二次put(null, 2)会把第一次的value覆盖,Key还是只有一个;第三题的输出是“期末复习”,因为StringBuilder是可变对象,方法内部修改会直接影响外部引用指向的那个对象。
这个自测方法有三个参数可以调:一是自测范围,建议只挑你容易混的考点写,不要每道题都改写成代码;二是自测方式,先手写结论再运行验证,不建议直接运行看结果;三是错误处理,写错的题目要用红笔把正确结论和出错原因抄到错题本上,不要只看一眼就过去。我见过的复习翻车,七成发生在“看答案时觉得自己懂了,合上文档写不出来”这个环节。
3. 程序阅读题:先手写结果并解释,再对答案
程序阅读题是“部分答案”文档里最值得花时间做的部分。这类题给出几段代码和一个main方法,要求你写出运行输出,或者指出代码能否编译。它考的是对Java运行机制的理解深度,光靠背答案完全没用——因为题目稍微改一个修饰符,输出就可能完全不同。
3.1 继承、多态、重载:阅读题最喜欢埋的三个雷
程序阅读题的核心考点集中在三块:继承与多态、重载与重写、String与StringBuilder的传参差异。这三块的出题方式高度套路化,识别特征也相对固定。
多态调用的识别规则就一句话:调用非静态方法看运行时类型,调用静态方法看编译时类型。体现在代码上就是,用父类引用指向子类对象时,调用被子类重写的方法,执行的是子类版本;调用static方法,执行的永远是声明类型(父类)的版本。很多阅读题的整道题就是围绕这一个点设计的。
重载和重写的区分是另一个雷区。重载发生在同一个类中,方法名相同、参数列表不同,编译器在编译期根据参数静态类型决定调用哪个方法;重写发生在父子类之间,方法签名完全一致,运行期根据对象实际类型决定调用哪个实现。阅读题经常会构造“父类引用调重载方法”的场景,这时记住一条结论:参数传递时选择哪个重载版本,只看编译时静态类型,不看对象真实类型。
String与StringBuilder的传参差异是第三个固定考点。String是不可变对象,方法内部的 s = s + "b" 只是把局部变量指向一个新对象,不影响外部引用;StringBuilder是可变对象,方法内部 append 会直接修改外部对象的内容。这两条一旦记混,阅读题连着两三道都会写反。
3.2 从“看题对答案”改成“先写后对”的实操流程
针对文档里带答案的阅读题,我的复习流程是五步:第一步,遮住答案,把代码抄到IDE里或者直接看题;第二步,在纸上写出你判断的运行结果,以及每一步判断依据;第三步,运行代码,对照实际输出;第四步,如果写错了,找到是哪一个考点判断失误;第五步,把这个题归类到前面说的三个雷区之一,写到错题本里。下面用一个综合示例演示这个流程的完整操作。
class Fu { public String name() { return "fu"; } public static String who() { return "static fu"; } } class Zi extends Fu { public String name() { return "zi"; } public static String who() { return "static zi"; } } public class ReadQuiz { public static void main(String[] args) { Fu ref = new Zi(); System.out.println(ref.name()); // 写出结果 System.out.println(ref.who()); // 写出结果 String s1 = "java"; String s2 = new String("java"); System.out.println(s1 == s2); // 写出结果 System.out.println(s1.equals(s2)); // 写出结果 StringBuilder sb = new StringBuilder("a"); change(sb); System.out.println(sb); // 写出结果 String str = "a"; change(str); System.out.println(str); // 写出结果 } static void change(StringBuilder s) { s.append("b"); } static void change(String s) { s = s + "b"; } }先按上面流程在纸上写出四个输出,再往下看。第一行输出是“zi”,ref的编译时类型是Fu,但name()是非静态方法且被子类重写,实际执行看堆上的对象类型Zi;第二行输出是“static fu”,因为who()是静态方法,编译期就绑定了Fu这个声明类型,多态不作用于静态方法。第三行输出false,==比较的是引用地址,s1在常量池、s2在堆上新分配;第四行输出true,equals比较的是字符串内容。第五行输出“ab”,StringBuilder被直接修改;第六行输出“a”,String不可变,方法内拼接创建的是新对象。
这套流程的关键在于第五步的归类动作。每错一道题,都逼自己说出“我错在哪个规则上”,而不是“我记错了输出”。我复习时的体感是:第一轮做这种题错误率在五成以上很正常,但归类三到五次之后,发现翻来覆去错的总是同一个点——比如静态方法不参与多态——这时候复习就从“做题”变成了“定点清除”,效率会明显提升。
4. 编程题:把三类常考题答出基本分,再追加分
复习题文档里最让人头疼的是编程题,尤其是没有答案的编程题。但期末编程题的题型其实非常固定,翻来覆去就是三类:集合的遍历与排序、自定义对象与文件读写、多线程基础。前两类出现频率最高,这里直接给出两套我复习时常用的模板。
4.1 集合遍历与排序:一套模板覆盖大半编程题
集合类编程题最常见的要求是:定义学生类(姓名、成绩),读入若干学生信息,按成绩从高到低排序,然后遍历输出。这个需求背后的考点是Comparable和Comparator的区别、排序稳定性的概念、遍历时不要边改边遍历。
import java.util.*; class Student { private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } public String getName() { return name; } public int getScore() { return score; } } public class SortQuiz { public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student("A同学", 82)); students.add(new Student("B同学", 95)); students.add(new Student("C同学", 77)); // 按成绩降序排序:Comparator.comparingInt 提取 key,reversed 反转 students.sort(Comparator.comparingInt(Student::getScore).reversed()); for (Student stu : students) { System.out.println(stu.getName() + ": " + stu.getScore()); } } }这段代码有三个参数值得说明。第一个是排序方向,reversed()是降序,想去掉就变成升序(从小到大),考试时务必看清题目要求;第二个是Comparator的选择,comparingInt适用于int字段,如果字段是String要用comparing,避免自动装箱;第三个是for-each和Iterator的选择,遍历时只读不改用for-each没问题,但要做“边遍历边删除”操作就必须用Iterator的remove()方法,否则会抛ConcurrentModificationException。
考试评分时最冤的失分点不是算法不对,而是输出格式不匹配。题目要求“姓名: 成绩”还是“姓名 成绩”还是“成绩:姓名”,必须严格按题目给的格式来。另外,如果题目点名要用Comparable(让Student类实现Comparable接口),那Comparator写法就不适用了,考试时先看题目约束再选写法。
4.2 自定义对象与文件读写:代码模板与评分点拆解
文件读写题是编程题里最容易丢分的部分,因为它的得分点不止一个:文件路径处理、字符集规范、每行数据的解析、资源关闭、异常处理,每个环节都是独立的采分点。下面给出一个从文本文件读取学生信息并输出的完整模板。
import java.io.*; import java.util.*; public class FileQuiz { public static void main(String[] args) { List<Student> list = new ArrayList<>(); String path = "scores.txt"; // try-with-resources:finally 自动关闭资源,不用手写 close() try (BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(path), "UTF-8"))) { String line; while ((line = reader.readLine()) != null) { if (line.trim().isEmpty()) { continue; // 跳过空行,避免 split 后数组长度不足 } String[] parts = line.split(","); if (parts.length < 2) { continue; // 跳过非法的脏数据 } Student stu = new Student( parts[0].trim(), Integer.parseInt(parts[1].trim()) ); list.add(stu); } } catch (FileNotFoundException e) { System.err.println("文件不存在: " + path); } catch (IOException e) { System.err.println("读取失败: " + e.getMessage()); } for (Student stu : list) { System.out.println(stu.getName() + ": " + stu.getScore()); } } }这段模板的几个设计决策。字符集固定写UTF-8,如果不指定会使用平台默认编码,在Windows中文系统上可能读出乱码,这是文件题的第一大坑。数据解析用了split(",")加trim(),因为原始数据里有可能是“A同学, 82”这种带空格的行,不trim直接parseInt会抛NumberFormatException,属于第二种高频崩溃点。异常处理拆成了FileNotFoundException和IOException两层,前者处理文件不存在,后者处理读写过程中的IO故障,考试时merge成一个IOException通常也能拿分,但拆开会更稳。
文件读写题的评分点我按优先级排序列了个表。最高优先级是数据能否正确解析出入的对象,解析逻辑错了后面全错;其次是异常和资源管理,资源不关闭扣分但不算致命,异常完全没处理直接无法编译;最后是输出格式和容错处理。很多人把大量时间花在优化排序算法上,结果在文件读入环节因为字符集没指定直接乱码,这是性价比最低的翻车方式。
5. 部分答案的使用避坑:参考答案会骗你,也会害你
这部分专门讲“部分答案”这个标题带来的实际问题。带答案的题容易让人产生虚假掌握感,没答案的题又容易让人战略性跳过,这两个坑叠加在一起,复习效果很容易打对折。下面按现象、原因、解决三个步骤拆。
5.1 现象:照着答案看一遍觉得全会了,合上文档写代码全空了
这是我见过最多的复习翻车现场。原因很清晰:看答案调用的是视觉识别,写代码调用的是记忆提取和生产,两条神经回路完全不同。看一遍答案产生的“会了”是熟悉感,不是掌握度,考场上的时间压力和手写环境会彻底戳破这种错觉。解决方式是强制切换输入方式:把答案当作校验器,而不是学习材料。先自己写,写不出来就翻到答案看一小段关键思路,然后合上文档继续写,而不是把答案从头抄到尾。
5.2 现象:代码在IDE里跑得好好的,考试时手动编译却报一堆错
这个坑主要出在编程题复习阶段。原因几乎都是IDE的自动补全掩盖了语言基本功——import语句没写、main方法签名写错、方法名拼写错误,在IDE里因为自动导包和自动修复功能完全暴露不了。解决方式是每周至少抽两次,用javac和java命令行手动编译运行练习代码。这个习惯还能顺带帮你练出手写代码的严谨度,考试是纯手写环境,没有编译提示,靠的就是这种肌肉记忆。
// 粘贴代码时最常见的三个编译失败点 import java.util.*; // 漏了这个,ArrayList 直接编译失败 public class Main { // 类名和文件名必须一致,大小写敏感 public static void main(String[] args) { // 漏了 static 或 String[] args System.out.println("ok"); } }5.3 现象:没有答案的题反复跳过,结果考场抽到的全是没答案的区域
部分答案文档天然会引导你把时间花在有答案的题目上,因为人对“能验证”的任务有天然偏好。但出题人不会按答案分布出题,没答案的部分往往是新题型或改编题,恰好是需要多动手的区域。解决方式是给没答案的题建立自己的验证渠道:自己写完后找同学互相批改,或者把题目改写成等效的小代码片段跑通验证逻辑,千万不要因为暂时无法验证就不做。宁可写错,不能跳过。
5.4 现象:凭印象答题,把易混知识点写反
复习到后期常见一种情况:题目见过、考点也认识,但写出答案是错的,比如字符串比较用==、substring的参数含义搞混、ArrayList的remove传int和传Object行为不同。原因是这些易混概念是靠“眼熟”记忆的,没有靠“区分特征”记忆。解决方式是做一张易混对照表,考前只看表不看题。我把最容易考的几条列在这里:equals与==、String与StringBuilder、ArrayList remove(int)与remove(Object)、HashMap与Hashtable对null的处理、final与finally与finalize。每条用一个代码片段验证过一次,比看十遍结论都管用。
5.5 现象:只刷题不手写,考场做题时间不够
最后一条是实战教训。Java期末的答题时间是固定的,题目量不会因为你复习时就该减少。我一直到考前三天才意识到,刷题时用IDE跑得飞快,但考场上要手写代码,速度差三倍都不止。解决方式是考前至少留三天用纸笔手写答案,写完后逐行对照模板检查拼写和标点。手写会暴露很多平时看不见的细节:中英文分号混用、方法名记不清、括号不配对,这些IDE里永远不会出现的问题,考场上是实打实的扣分点。
6. 考前三天把复习效果再往上提一档:三遍过题法
最后三天的复习策略,不建议再广撒网刷题了。这时候要做的是压缩复习周期、强制输出。我自己的习惯是把那类Java复习题文档按题型分成三组,三天各攻一组,每天只做一件事。
第一天只做程序阅读题,遮住答案,用前面说的“先写后对”流程把带答案的题全部过一遍;没答案的阅读题,在纸上补全代码后,用IDE验证输出。第二天的任务是编程题,每道题限时12分钟,先做完整模板版本,再检查排序、文件读写的评分点有没有全踩。第三天回到选择题,只看两样东西:错题本和易混对照表,已经会的不再看。
这个策略的核心在于把有限时间全部投在“输出型复习”上。阅读题练的是你判断运行结果的能力,编程题练的是你手写完整程序的速度和准确度,选择题看错题练的是考前最后的查漏。复习题的答案本来就是残缺的,不需要把每个空都填满,真正重要的是你自己能产出的那部分。祝期末顺利。
这三天的安排可以做成一个简单的验收表:每天结束时,问自己三个问题——今天做了几道题、错了几道、错的原因能不能说清。能说清原因,这道题就是真的掌握了;说不清的,明天继续弄懂。我自己的血泪经验是,复习这件事最忌讳“收藏即掌握”,答案抄了厚厚一本,最后考试还是没底。用输出检验复习,用错因驱动补漏,希望帮到你。
本文还有配套的精品资源,点击获取