封装、继承、多态是Java面向对象的三大核心特性:封装通过private+getter/setter实现权限控制与接口统一,保障数据安全与可维护性;继承基于“is-a”关系复用结构并遵循里氏替换原则;多态依托方法重写与向上转型,实现运行时动态绑定,提升系统扩展性。

回答Java面向对象面试题,关键不是背定义,而是讲清楚“为什么这么设计”和“用在哪儿”。面试官想看到你对封装、继承、多态的理解是否落地,能不能联系实际场景说清逻辑。
封装:不是为了藏,是为了可控
封装的核心是“权限控制 + 接口统一”。它不是简单把字段设成private就完事,而是通过访问修饰符(private / protected / public / 默认)划定责任边界,再配合getter/setter或业务方法做校验和约束。
- 比如年龄不能为负数或超过120,就在setAge()里加判断,而不是让调用方自己检查
- JDBC连接池、MyBatis的SqlSession,对外只暴露openSession()、commit()等方法,内部怎么建连、缓存、解析SQL全被封装起来
- 真正体现封装价值的地方:改内部实现不影响外部调用——换数据库驱动、升级ORM版本,业务代码不用动
继承:重用结构,但要守住"is-a"关系
继承不是为了“少写几行代码”,而是表达一种天然的层级归属。子类必须能自然地被当作父类来使用(里氏替换原则)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Animal → Dog / Cat 是合理的;但用继承去复用工具方法(比如StringUtils)就违背初衷,该用组合
- Java只支持单继承,但Object是所有类的隐式父类,所以每个对象都有toString()、equals()等基础能力
- 构造器不能被继承,子类构造时默认先调用super(),确保父类状态被正确初始化
多态:靠重写+向上转型,实现“一调多能”
运行时多态是OOP的灵魂。它的前提是:有继承(或实现接口)、有方法重写、用父类/接口类型引用指向子类对象。
立即学习“Java免费学习笔记(深入)”;
- 例如PaymentService p = new WechatPay(); p.pay() 和 p = new Alipay(); p.pay() 调用的是不同实现,但调用方代码完全一样
- 编译看左边(引用类型),运行看右边(实际对象类型)——这是JVM动态绑定机制决定的
- 多态让系统容易扩展:新增支付方式,只需加个新类实现PaymentService,原有调用逻辑零修改
抽象:提前划好契约,不纠结细节
抽象类和接口不是“可选项”,而是架构设计的语言。它们帮你提前约定“必须有什么”,而不规定“具体怎么做”。
- 抽象类适合有共性代码的场景(比如通用的日志记录、初始化逻辑),子类继承后只需补实现差异部分
- 接口更适合定义能力契约(如Flyable、Serializable),一个类可以实现多个接口,表达“它能做什么”
- JDK 8之后接口可以有default方法,既保持契约灵活性,又支持向后兼容升级

















