Java面向对象(OOP)核心是封装、继承、多态与抽象,封装重在控制访问边界与保障数据一致性,继承须遵循“is-a”关系并遵守里氏替换原则,多态聚焦运行时动态行为绑定以解耦调用与实现,抽象类侧重共性抽取,接口强调能力契约。

Java面向对象(OOP)是面试必考核心,不是背概念,而是看你怎么用它解决问题。关键在三点:说清原理、讲对场景、写对代码。
封装:别只说“private+getter/setter”
封装的本质是控制访问边界,不是加个private就完事。面试官想听的是设计意图:
- 字段私有化后,setter里可以加校验逻辑(比如年龄不能为负、邮箱格式校验),而直接暴露字段做不到;
- 后续修改内部实现不影响外部调用(例如把String name改成Name对象封装,只要getter返回逻辑不变,调用方完全无感);
- 避免对象处于不一致状态——比如银行账户余额和交易记录必须同步更新,封装能确保这两个操作被绑定在一个方法里执行。
写代码时,优先用private字段 + 有意义的public方法,而不是为所有字段机械生成getter/setter。
继承:警惕“为了复用而继承”
Java只支持单继承,滥用继承容易导致类层次臃肿、语义混乱。面试中常被追问:
立即学习“Java免费学习笔记(深入)”;
- Animal → Dog/Cat 是合理继承,因为Dog “is-a” Animal;
- 但“Car has-an Engine”就不能用继承,该用组合(Engine作为Car的成员变量);
- 子类重写父类方法时,必须遵守里氏替换原则——任何父类能出现的地方,子类也该能无缝替代。
如果发现子类要覆盖父类方法并抛出异常、或缩小访问权限,大概率设计错了,该考虑接口或组合。
多态:运行时行为才是重点
多态不是“父类引用指向子类对象”这句口诀,而是解决“同一动作,不同对象不同响应”的实际问题:
- 方法重写(override)是运行时多态,由JVM根据实际对象类型动态绑定;
- 方法重载(overload)是编译时多态,只看参数列表,和对象类型无关;
- 典型应用:支付模块中,PayService.process(Payment payment) 方法,传入Alipay、WechatPay、CardPay等不同对象,各自执行不同的签名、回调逻辑,上层无需if-else判断类型。
面试写代码,优先体现多态价值:定义抽象/接口,让具体实现类决定行为,而不是在业务逻辑里写一堆instanceof。
抽象类 vs 接口:别再只背“能写方法体”
两者定位不同,选错会埋下扩展隐患:
- 抽象类强调“是什么”,适合同类事物共性抽取(如Animal有name、age、eat()通用逻辑,子类只需补sound());
- 接口强调“能做什么”,适合跨领域能力组合(如Runnable + Serializable + Cloneable,一个类可同时具备多种契约);
- Java 8+ 接口支持default/static方法,但仅用于提供默认行为,不应承载核心业务逻辑;抽象类则可含构造器、成员变量、复杂初始化流程。
当多个类需要共享状态或初始化逻辑时,抽象类更合适;当关注能力契约、需多实现时,接口更灵活。


















