java面向对象(oop)面试核心在于讲清逻辑而非死记概念:封装强调“控制访问+隐藏实现”,需结合getter/setter校验与不可变返回;继承与多态须区分编译期类型与运行期行为,明确重写才有多态、字段无多态;抽象类表“is-a”共性,接口表“can-do”能力契约;访问修饰符需按包结构与继承链动态判断可见性。

Java 面向对象(OOP)是面试必考模块,重点不在背概念,而在讲清逻辑、辨清边界、结合代码说清楚“为什么这么设计”。真正卡人的点,往往藏在看似简单的特性交叉处——比如封装和访问修饰符怎么配合用才合理;继承和多态一起出现时,编译期和运行期行为如何区分;抽象类和接口选哪个,得看具体场景,不是死记语法差异。
封装:不是加个 private 就完事
封装的核心是“控制访问 + 隐藏实现”,不是单纯设 private。面试常被追问:为什么 getter/setter 里要校验?为什么不直接暴露字段?
- setter 中做合法性检查(如 age 不能为负、email 格式校验),保证对象状态始终有效
- getter 可返回副本(如返回 List 的 unmodifiableList 或 new ArrayList),避免外部修改内部数据
- 某些字段根本不需要 setter(如 ID、创建时间),只提供构造器注入或只读访问
继承与多态:必须同时讲清“谁调用”和“谁执行”
面试官爱画一张图让你解释输出结果,本质是在考你是否分得清编译时类型和运行时类型。
- 父类引用指向子类对象(Animal a = new Dog();)是多态前提
- 只有被重写(override)的方法才有多态效果;重载(overload)只看编译时类型
- 静态方法、private 方法、final 方法不参与多态,调用完全由声明类型决定
- 字段访问不具多态性——a.name 输出的是 Animal 类里的 name,不是 Dog 的
抽象类 vs 接口:别只答“抽象类能有构造器、接口不能”
关键在设计意图:
- 抽象类表达“是什么”(is-a 关系),适合有共通状态和基础实现的类族,比如 Animal 有 name、age 和默认 move() 实现
- 接口表达“能做什么”(can-do 关系),强调能力契约,比如 Flyable、Swimmable,可被无关类实现(Bird 和 Drone 都能 Flyable)
- JDK 8+ 接口可含 default/static 方法,但依然不能有实例字段;抽象类可定义 protected 字段供子类复用
- 一个类只能继承一个抽象类,但可实现多个接口——这是解决单继承局限的关键手段
访问修饰符:结合包结构和继承链判断可见性
光背表格容易错,得代入真实项目结构想:
- private:仅当前类内可用,连同包的其他类都不可见
- 默认(package-private):同包可访问,但子类即使在不同包也不行(注意和 protected 区分)
- protected:同包 + 不同包的子类都能访问,但其他无关类不行
- public:任何地方,但慎用——暴露越多,后期越难改
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











