Java面向对象三大特性是封装、继承、多态:封装通过访问控制与业务校验保障数据一致性;继承适用于明确“is-a”且需复用稳定状态的场景,否则优先组合;多态依赖父类引用指向子类对象、方法重写及运行时绑定,体现为编译看类型、运行看实例。

回答Java面向对象面试题,关键不是背定义,而是讲清楚“为什么这么设计”和“用在哪儿”。面试官想看的是你对OOP本质的理解,而不是复述教科书。
封装:不只是private+getter/setter
封装的核心是控制访问边界,保护数据一致性。比如一个银行账户类,余额不能被外部直接赋值为负数——哪怕用了private,如果setter里没校验,照样出问题。真正体现封装水平的,是能否在setter中加入业务逻辑(如余额变动需记录日志、触发通知),或者用不可变对象(final字段+无setter)杜绝意外修改。面试时可以补充一句:“封装不是锁死,而是提供安全、可控的入口。”
继承:慎用,优先考虑组合
Java只支持单继承,过度使用容易导致类层次僵化。比如“鸟会飞”看似合理,但鸵鸟、企鹅继承后就得重写fly()或抛异常,违背里氏替换原则。更合理的做法是提取“飞行能力”为接口(Flyable),让需要的子类去实现。面试中提到继承,最好顺带说明它的适用场景:当存在明确的“is-a”关系,且子类确实需要复用父类的**稳定状态和通用行为**时才用。
多态:必须讲清运行时绑定的条件
- 父类引用指向子类对象(如 Animal a = new Dog();)
- 调用的是被重写(@Override)的实例方法(非static、非private、非final)
- 方法调用在运行期由JVM根据实际对象类型决定,不是编译期
可以举个小例子:List list = new ArrayList(); list.add("x"); 这里add()就是多态体现——编译看List接口,运行走ArrayList实现。如果答“重载也算多态”,要说明那是编译时多态,面试中重点考察的是运行时多态。
立即学习“Java免费学习笔记(深入)”;
抽象与接口:区分设计意图
抽象类强调“是什么”(共性模板),适合有共享代码或构造逻辑的场景;接口强调“能做什么”,适合定义能力契约。Java 8之后接口可加default方法,但依然不能有构造器、成员变量(只能是public static final常量)。高频陷阱题:类实现多个接口时方法冲突怎么处理?答案是必须显式重写该方法,否则编译不通过。


















