☰
Java面向对象期末复习:封装继承多态考点与程序阅读题拆解
2026/9/29 18:00:03 网站建设 项目流程

期末Java面向对象复习,最坑的不是知识点多,而是知识点之间纠缠不清。你单独问封装、继承、多态是什么,大家都能说几句,但一落到选择判断题里,各种细节陷阱直接把人整懵。这篇复习详解就是把面向对象整棵知识树给你捋清楚:类与对象的底层关系、三大特性的考点分布、抽象类和接口的语法边界、static和final的常见坑位、程序阅读题的拆题套路,最后再给一套考前冲刺路线。考前一晚看完,比翻三遍书都有用。

1. 类和对象的本质关系:别再把概念题做错

1.1 类与对象,把这个比喻焊死在脑子里

期末卷子里第一个爱出概念题的地方,就是类和对象的关系。很多同学背了几遍定义,换一种说法就懵。我用了很多年的一个比喻:类就是图纸,对象就是用图纸盖出来的房子。

图纸能住人吗?不能,房子才能住人。但在Java里,你天天通过new创建出来的那个东西,本质上就是按照图纸(类)生产出来的具体实例(对象)。所以类是对一类事物的抽象描述,对象是这个抽象描述的具体化实例。

概念题最常见的出法是这样:一个班级有50个学生,每个学生有学号、姓名、成绩,请问这里类和对象分别指什么?答案是学生是类,那50个具体的、各自独立的学生实例是对象。注意,不是“班级”是类,很多人一看到班级两个字就条件反射选班级,这是题目里最常见的误导手法。

还有一个绑定概念:类是一种数据类型。Java里除了int、double这些基本数据类型,我们自定义的类其实也是一种数据类型,只是它属于引用数据类型。这句话经常出现在判断题里,记住结论:类本质上是引用数据类型,对象是类的实例。

1.2 new关键字背后发生了什么

期末考试的程序阅读题,最爱用一段简单代码考你内存里发生了什么。我给你拆开讲清楚。

假设代码是这样:

Student stu = new Student();

这一行代码在内存里干了三件事:

第一,在栈内存中声明一个引用变量stu,这个变量此刻还是空的,值为null。第二,在堆内存中为Student对象分配空间,调用构造方法完成初始化,把对象的成员变量赋予默认值或指定值。第三,把堆内存中对象的首地址赋值给stu这个引用变量。从此以后,stu就是通往那个对象的一把钥匙。

很多同学记不住“引用变量在栈、对象在堆”这个结论,我教一个联想方法:栈的特点是空间小、存取快,适合放轻量级的引用和基本类型变量;堆的特点是空间大、生命周期灵活,适合放真正的对象数据。就像停车场的查询器,栈上的引用很轻巧,但你要找的车,也就是堆里的对象,才是真正占地方的大家伙。

这个知识点不光期末考,Java面试也考。理解了它,对后面学数组、学集合、理解垃圾回收机制都有帮助,因为那些东西全都建立在“引用指向堆对象”这个模型上。

2. 三大特性,期末最核心的大题来源

2.1 封装:不只是加上private就完事

封装的定义好背:把对象的属性和行为结合成一个独立的整体,并尽可能隐藏对象的内部实现细节。但期末真正考你的是怎么落实封装,以及为什么要这么干。

落实封装的标配动作是:成员变量用private修饰,然后对外提供public的getter和setter方法。

这里有个很多新手容易犯的错,觉得setter方法就是把值赋进去就结束了。实际上setter方法的价值在于“检查”两个字。举个典型例子,假设类里面有个age属性,正常人年龄不可能是负数,也不可能超过150。如果放任外部代码直接修改age,坏数据就灌进来了。但在setter里加上校验逻辑,非法数据直接被拦在外面。

public void setAge(int age) { if (age < 0 || age > 150) { System.out.println("非法年龄数据"); return; } this.age = age; }

这类知识点在期末大题里经常以“请完善某个类的封装”形式出现,判分点一般有三个:属性是否private、是否有完整的getter和setter、setter中是否有必要的逻辑判断。很多人能拿前两分,第三分丢得最冤。

访问修饰符的访问权限范围,是选择题高频考点,建议把下面这张表背下来:

修饰符同类同包子类(不同包)全局
private可以不可以不可以不可以
默认(不加修饰符)可以可以不可以不可以
protected可以可以可以不可以
public可以可以可以可以

提醒一下,这张表的第四列“子类(不同包)”是最容易记混的地方。默认权限是包内可见,包外的子类访问不了,只有protected级别的权限才开放给包外子类。考试选择题经常给代码让你判断某个字段能否被访问,直接把这张表背熟,选择题拿分最稳。

2.2 继承:super和构造执行顺序是重灾区

继承的知识点很多,但期末最爱考的就是三块:super的使用、重写的规则、构造方法的执行顺序。

先说super。super在子类里有三种用法:

  • super.属性:访问父类中被隐藏的成员变量。
  • super.方法:调用父类中被重写的实例方法。
  • super():调用父类的构造方法,且必须写在子类构造方法的第一行。

第三种用法有个强制规则:如果子类构造方法里没有显式写super(...),编译器会自动补一个super()调用父类的无参构造。所以很多程序阅读题里,你会发现new子类对象的时候,父类的无参构造方法先被执行了,然后才执行子类自己的构造方法体。

这就是经典的“先父后子”构造顺序,考试几乎必考。给你一个实用的记忆锚点:装修房子要先打地基再刷墙。地基是父类,刷墙是子类,顺序不能反。

再说重写。重写(Override)的规则可以用六个字总结:同声明、宽访问。

  • 同声明:方法名、参数列表必须完全相同。
  • 宽访问:子类重写方法的访问权限不能比父类更严格。父类方法是public,子类重写就不能是private,这是很多选择题的经典陷阱。

还有一条隐藏规则:重写不能抛出比父类更大的受检异常。这条通常放在异常章节考,但如果你记住了,在程序阅读题里也能帮你快速判断一段代码是否合法。

2.3 多态:重载与重写要分清,但差别巨大

多态在Java里分两种:编译时多态和运行时多态。编译时多态就是方法重载(Overload),运行时多态就是方法重写(Override)结合向上转型。

方法重载的规则一句话能说完:同一个类中,方法名相同、参数列表不同。这里的参数列表不同,包括个数不同、类型不同、顺序不同。注意,返回值不同不算重载,这是每年都有不少人栽的坑。有的同学不服气,说两个方法就返回值不一样,其他都一样,怎么就不能共存?

实际上编译器根本没法区分调用的是哪个方法,因为调用方法的时候你不一定把返回值接住。比如单独写一行method(),编译器就不知道你调的是哪个method了。所以这设计不是Java偷懒,是为了避免二义性。

运行时多态的精髓是“父类型引用指向子类对象”。看这段经典代码:

Animal a = new Dog(); a.speak();

编译时,a的静态类型是Animal,编译器只允许你调用Animal类里声明过的方法;运行时,实际调用的是Dog类重写后的speak()方法。这就是“编译看左边,运行看右边”口号的由来。

期末试卷的程序阅读题里经常挖一个坑:父类引用调用了子类新增的方法。比如Dog类里有一个bite()方法,但Animal类里没有,如果直接用a.bite(),这段代码直接编译错误。原因就是刚才说的,编译期编译器只认Animal类型里有什么方法。想调用子类特有的方法,必须先做向下转型。

说到转型,顺便把instanceof讲掉。判断一个引用变量是否属于某个类,或者它的子类类型,用instanceof:

if (a instanceof Dog) { Dog d = (Dog) a; d.bite(); }

向下转型之前必须先做instanceof判断,否则可能抛出ClassCastException。这个原则在期末程序阅读题和编程题里都是高频操作。

2.4 构造方法的细节坑位整理

构造方法是期末选择题集中出题的地方。我把学生容易踩的坑全部列一遍。

第一,构造方法的名字必须和类名完全一致,包括大小写,不能有返回类型,连void都不能写。很多人以为void不算返回类型,写上void也“能运行”,实际上写了void之后,它就不再是构造方法了,而是变成了一个普通方法。代码编译不报错,但语义完全不同,new对象时根本不会调用它。

第二,每个类默认有一个无参构造方法。但是,一旦你手写了任何一个带参构造方法,默认的无参构造就消失了。如果你再想new一个无参对象,就必须自己手写一个无参构造。这个要点每年必考,尤其结合继承出现时更阴险:父类只有带参构造,子类构造方法里如果不显式调用super(带参),编译器会尝试调用super(),然后发现父类没有无参构造,编译直接报错。

第三,构造方法可以重载,也可以在一个构造方法里调用另一个构造方法,写法是this(参数),且必须放在第一行。同时要注意,this()和super()不能同时出现,因为它们都要求自己必须是第一行。

第四,静态代码块、构造代码块、构造方法的执行顺序,这是经典阅读题。记住结论:静态代码块在类加载时执行,且只执行一次;静态代码块先于构造代码块;构造代码块先于构造方法。

如果有继承关系,完整顺序是:父类静态代码块,然后子类静态代码块,接着父类构造代码块,再父类构造方法,然后子类构造代码块,最后子类构造方法。

这个顺序表期末前建议默写三遍,因为考频实在太高了。

3. 抽象类、接口与关键字的判断题陷阱

3.1 抽象类与接口:怎么选,期末大题的标准答法

抽象类和接口是期末大题的常客。两者都是不能直接new的类型,但考点和答案大不相同。

抽象类用abstract class定义,可以包含抽象方法,也就是没有方法体的方法,也可以包含普通方法、成员变量、构造方法,甚至静态方法。接口用interface定义,从JDK8开始可以有default方法和静态方法,JDK9之后还能有私有方法,但接口里不能有实例字段,只能有常量。这个常量其实自带public static final修饰,即使你不写,编译器也会自动补。

一个记忆技巧:抽象类是“is-a”关系,接口是“has-a”能力。打个比方,狗是动物,所以Dog extends Animal;飞机有飞行的能力,所以Plane implements Flyable。

期末大题问“为什么用接口而不用抽象类”时,最标准的答案是:Java类是单继承的,一个类最多只能继承一个抽象类,但一个类可以实现多个接口。接口弥补了Java单继承的不足,解耦能力更强。

还有两个高频判断考点:抽象类能不能没有抽象方法?能。只要类被abstract修饰,哪怕里面全是普通方法,也不能实例化。接口能不能有实现方法?从JDK8开始能,但必须是default方法或静态方法。这些全是选择题喜欢抠的细节。

3.2 static和final的关键字高危陷阱

static修饰的成员属于类,不属于某个对象。这个基本概念不难,难的是它的衍生结论。

static方法里能不能用this和super?不行。因为this和super代表对象层面的引用,而static方法在类加载时就已经存在,可以脱离对象直接通过类名调用,自然不能访问跟具体对象绑定的东西。

static方法能不能访问实例成员变量?不行。因为实例成员变量必须有对象才存在,而static方法不依赖对象存在。反过来,实例方法能不能访问静态成员?能。这个单向关系经常出现在判断题里。

static代码块前面讲过了,类加载时执行一次,多个静态代码块按书写顺序执行。

再说final。final修饰的变量,基本类型不能改变值,引用类型不能改变地址。注意,这个“引用类型不能改变地址”不代表对象内部的数据不能变。举例:

final ArrayList<String> list = new ArrayList<>(); list.add("hello");

这段操作是合法的。因为final锁死的是list这个引用指向哪个对象,而不是对象内部能不能变。期末考试有判断题专门在这里设坑,很多人以为final了就不能往集合里加数据,那是对final的误解。

3.3 值传递与引用传递:必考题里的必考题

Java里到底是值传递还是引用传递?期末必考,Java面试也必考,标准答案是:Java只有值传递。

对基本类型,传的是值本身,方法内修改不影响外部变量。对引用类型,传的是引用的拷贝,也就是地址的值。这句话很多人背下来但不理解,拆开讲。

方法的参数本质上是把实参“复制一份”给形参。基本类型复制的是里面的数据,所以你在方法里改形参,改的是副本,原数据纹丝不动。引用类型复制的是栈上的地址值,也就是说形参和实参指向同一个堆对象。

这时候,如果在方法里通过形参修改对象的属性,外部对象的属性确实会被改,因为两边手里拿的是同一个对象的地址。但是,如果在方法里给形参重新赋值,比如p = new Person(),外部实参还是指向原来的对象,不会受任何影响。

期末程序阅读题经常考这段描述:

public static void change(Person p) { p = new Person(); p.name = "张三"; }

问执行后外部的Person对象name是什么。答案是不变,还是原来的值。因为方法内部的p = new Person()只是让形参改指了别处,对外部毫无影响。这个坑,十个学生里有六个会掉进去。

4. 期末高频真题与易错题逐题拆解

4.1 选择题高频考点清单

期末选择题其实是有题库逻辑的。知识点就那么多,翻来覆去考。把最常见的出题点整理成清单,你对着自查:

  • 类与对象的关系辨析。
  • 访问修饰符的访问范围。
  • 重载与重写的判断。
  • 构造方法与普通方法的区别。
  • 值传递与引用传递的结果判断。
  • 抽象类与接口的语法特性。
  • static和final的组合含义。
  • 类加载与构造的执行顺序。
  • instanceof语法的正确书写。
  • this和super的用法及限制。

这十类如果都能说清楚,选择题基本能拿满分。不建议考前盲目刷大量偏题怪题,把这十类考点回到课本对应章节逐个啃透,效率远高于题海战术。

4.2 程序阅读题的通用拆题套路

程序阅读题是期末拉开差距的重头戏。很多同学看到代码就从第一行读到最后一行的输出,然后凭感觉写答案。这种答法太被动。

我的建议是养成固定的四步读题流程:

第一步,先找main方法,把程序执行入口定住。 第二步,遇到new操作,就在草稿纸上画一个对象框,写清楚这个对象里成员变量的状态。 第三步,变量赋值、方法调用都在草稿上追踪,尤其是引用类型的赋值,要搞清楚多个引用是否指向同一个对象。 第四步,遇到重写方法调用时,判断编译期类型是什么,运行期实际类型是什么。

有一个实用技巧:代码里如果出现父类引用指向子类对象,那么调用方法时,先在子类里找有没有重写。找到就调子类的,找不到就往上找父类的。如果再找不到,那就要检查是不是编译错误了。

4.3 编程题的标准答题结构与常见扣分点

期末编程题一般就两类:一类是按需求定义类和对象,另一类是给定场景补全某个类的封装或继承关系。

这类题想拿高分,结构比功能更重要。我见过太多学生代码功能是对的,但类设计一塌糊涂,属性全部public,setter里没有校验逻辑,方法命名随意。结果就是老师想给分都找不到给分点。

给你一个标准模板。题目要求设计一个学生类Student,包含学号、姓名、成绩属性,并提供相关方法。高分作答应该是:

属性部分,全部使用private修饰。 构造方法,提供一个无参构造和一个带参构造。 getter和setter,每个属性都配齐。 setter中建议包含必要的校验逻辑,这是加分项。 重写toString方法,用于输出对象信息。 按题意补充需要的行为方法。

注意一个判分细节:还有参构造时,建议调用setter完成赋值,而不是直接this.name = name。为什么?因为setter里有校验逻辑,直接赋值会绕开校验。这个面向对象的设计思想,在编程题评分标准里尤其看重。我见过有老师专门在试卷上标注“必须通过setter赋值”,目的就是考察你理不理解封装的意义。

5. 一周冲刺复习路线与实操建议

5.1 三轮复习法:从知识到题感

如果考试还剩一周,建议按三轮来安排时间。

第一轮,第1-2天,过知识点框架。不用细抠每一个代码示例,重点是把你课本目录里的面向对象章节标题变成自己的知识树,每个章节能说出一句话概括。说不上来的地方,立刻翻书或者看这篇博文对应的章节。

第二轮,第3-4天,刷题与程序阅读并列推进。把课本习题、老师发的复习题里所有面向对象的选择题、填空题、程序阅读题做一遍。做完对答案后,错题要回到对应知识点再理解一遍,而不是只背答案。

第三轮,第5-6天,全真模拟与编程题专项。找一套往年真题,掐时间完成。重点训练程序阅读题的草稿画图能力和编程题的完整代码书写。考前一天不再做新题,只看错题和记忆表格。

5.2 动手实践:把抽象概念变成本能

只看书永远学不会面向对象。动手敲代码,是对概念最好的检验。

封装那部分,自己写一个Employee类,把所有成员变量设为private,加上getter和setter,并在setter里写上校验规则。写好之后你才能体会“改一处,处处受益”的含义。

多态那部分,写一个Shape父类,定义draw()方法,然后写Circle、Rect、Triangle三个子类重写draw()。再写一个drawShape(Shape s)方法,分别传入不同的子类对象,看看输出有什么不同。实测几次之后,多态这个概念就再也不用死记硬背了。

写代码时肯定会有各种报错。这个阶段别怕,每修一个错,你对Java的理解就更深一层。期末复习阶段写代码的重点不在代码量,而在于你能不能亲眼看到程序的执行过程。建议打开IDEA的Debug模式,在new语句后面加断点,亲眼看一下对象在内存里的分配过程,亲眼看一下引用变量指向哪里。这个视觉化体验,比看再多文字解释都有用。

5.3 考前最后一天的核心清单

考前24小时,不建议再翻大段教程。重点过这几样东西:

  • 访问修饰符权限表,默写一遍。
  • 重写与重载的对照表。
  • 构造方法与代码块的执行顺序表。
  • 运行时多态的判断口诀:编译看左边,运行看右边。
  • 类设计的标准写法,包括封装类、继承子类、接口实现类。
  • 值传递的结论总结。

还可以把这篇博文里的所有表格重新默写一遍。能默写出来的才是真掌握了,默写不出来的地方,考前还有时间翻回来补。我自己当年复习时就有这个习惯:把每章考点浓缩成一张A4纸,临考前只看这几张纸。信息越多越焦虑,少而精的东西反而在考场上最提分。

我个人在带复习过程中最深的感受是,Java面向对象这块,拉开分数差距的从来不是谁更聪明,而是谁把基本概念之间的连接想得更清楚。你花一晚上弄明白值传递和引用传递的真实关系,往往比刷五十道选择题还有用。这篇博文把所有值得考前重点过一遍的内容都串了一遍,剩下的就看你动手了。期末稳过,冲。

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

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

立即咨询