java面向对象面试重在理解封装、继承、多态本质:封装强调控制访问与隐藏实现;继承需满足“is-a”及里氏替换原则,优先组合;多态依赖运行时动态绑定,体现开闭原则;类与对象需区分定义与实例的内存与生命周期。

Java面向对象面试题不是考死记硬背,而是看能不能把封装、继承、多态讲清楚、用得对。答得好,关键在三点:说清概念本质、结合代码场景、点出设计意图。
封装:不是加个private就完事
封装的核心是“控制访问 + 隐藏实现”。光把字段设成private远远不够,重点在于是否提供了合理、有约束的对外接口。
- 比如Student类里age设为private后,setter方法要校验范围:if (age 150) throw new IllegalArgumentException();
- getter/setter不是模板填充,而是业务边界的守门人;有些字段根本不需要暴露(如密码加密后的hash值),就不该有getter
- 真正体现封装意识的地方,是让调用方只关心“能做什么”,不依赖“怎么做的”——比如一个
pay()方法内部走微信还是支付宝,外部完全无感
继承:复用≠滥用,父子关系要真实
继承表达的是“is-a”关系,不是为了省几行代码就随便拉个父类。面试官常会追问:这个继承设计有没有违反里氏替换原则?
- 子类必须能完全替代父类出现在任何位置。例如:如果父类
Animal有fly()方法,但子类Dog继承它却抛UnsupportedOperationException,这就是设计缺陷 - 优先考虑组合优于继承。比如“汽车有引擎”,更适合用
Engine engine成员变量,而不是让Car继承Engine - 抽象类适合定义共性骨架(如模板方法),接口适合定义能力契约(如
Runnable、Comparable)
多态:运行时绑定才是灵魂
多态不是写个Animal a = new Dog()就叫多态,关键是看方法调用是否在运行时才决定执行哪个版本。
- 必须满足三个条件:继承/实现关系 + 方法重写 + 父类引用指向子类对象
- 静态方法、private方法、final方法不参与多态——它们在编译期就绑定了
- 典型应用:策略模式(不同支付方式统一调
pay())、模板方法(父类定义流程,子类实现细节) - 面试时可以补充一句:多态让新增子类无需修改已有调用逻辑,是开闭原则的落地体现
类与对象:别混淆“定义”和“实例”
很多回答卡在“类是模板,对象是实例”这种比喻上,其实更关键的是内存和生命周期的理解。
- 类加载进方法区,只有一份;每个new出来的对象都在堆中独立分配空间
- 成员变量存在堆中(随对象生命周期),局部变量存在栈中(随方法调用进出)
- 构造方法没有返回值类型(连void都不能写),它的唯一作用是初始化新对象的状态
- 默认构造方法只在类中没写任何构造器时才自动提供;一旦写了带参构造,无参构造就得手动补上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











