破题关键在于讲清“为什么这么设计”和“出问题时如何定位”,需将封装(责任边界与校验逻辑)、继承(is-a关系与复用原则)、多态(运行时绑定与策略模式)、抽象(接口契约与抽象类共性)串成逻辑线,并结合真实项目问题说明价值。

破题关键不是背四大特性,而是讲清楚“为什么这么设计”和“出问题时怎么定位”。面试官想看的,是你能不能把封装、继承、多态、抽象串成一条逻辑线,而不是零散复述定义。
封装:别只说private,重点讲“控制权交到哪”
封装的本质是划定责任边界——谁该知道什么、谁该改什么。比如一个订单类,金额字段用private,不是为了“防着别人”,而是把校验逻辑收归内部(比如不能为负、必须两位小数),外部只能通过setAmount()进入校验流程。
- 面试时被问“为什么不用public字段?”,答“避免绕过业务规则直接赋值”,比“提高安全性”更到位
- getter/setter不是摆设:set里加日志、参数校验、状态同步(如修改用户名同时更新缓存key)
- 注意protected的使用场景:子类需要访问但外部不需要——比如框架基类中供子类扩展的钩子方法
继承:单继承不是限制,是强制你理清is-a关系
Java只允许单继承,恰恰逼你思考“这个类最本质的身份是什么”。比如“支付服务”不能既继承“微信支付”又继承“支付宝支付”,就得抽出共同父类Payment或接口PaymentStrategy。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 子类构造器第一行默认调super(),如果父类没无参构造器,必须显式写super(…)——这是高频踩坑点
- private成员不被继承,但可以通过protected/public方法间接访问;static方法属于类,不参与继承链的动态分派
- 别为了复用硬套继承:工具类(如DateUtils)、配置类(如AppConfig)更适合用组合而非继承
多态:运行时绑定才是灵魂,不是重载就叫多态
真正体现多态的,是这行代码:Animal a = new Dog(); a.sound();——编译时看Animal,运行时看Dog。JVM靠虚方法表查实际类型的方法入口,这才是底层机制。
- 字段和静态方法不参与多态:即使Dog重写了Animal的static sound(),a.sound()调的仍是Animal版本
- 重载(overload)是编译时多态,靠参数列表匹配;重写(override)才是运行时多态,依赖继承+同签名+访问权限不缩限
- 面试手写多态案例,建议用策略模式收尾:“用Payment接口统一收银入口,不同支付方式实现各自pay(),主流程完全不改”
抽象:接口和抽象类不是二选一,是分工协作
抽象类是对“是什么”的归纳(共性属性+部分实现),接口是对“能做什么”的契约(行为规范)。比如User抽象类可含id、name、loginTime等通用字段和基础方法;而Payable、Exportable这类能力,就该拆成接口。
- Java 8+接口支持default方法,但别滥用——它适合提供向后兼容的默认实现,不是放业务逻辑的地方
- 抽象类可以有构造器、成员变量、具体方法;接口只能有public static final字段和public abstract(或default/static)方法
- 面试被问“什么时候用抽象类?”,答“当多个子类共享状态或需强制初始化流程时”,比如所有数据库DAO都必须先checkConnection()
不复杂但容易忽略:每讲一个特性,顺手带一句它在真实项目里解决过什么问题。比如封装帮你拦截了非法金额提交,多态让你新增一种支付方式不用动订单主流程——这才是让面试官记住你的点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










