面向对象实战题考察封装、继承、多态、抽象在业务场景中的合理应用:需准确识别对象关系,用访问控制实现可控封装,通过父类型引用体现多态,依“是什么”选抽象类、“能做什么”选接口。

直接切入核心:面试官问“面向对象实战演练题”,不是考你背概念,而是看你能不能把封装、继承、多态、抽象这四个特性,自然地用在具体场景里解决问题。答得好,关键不在代码多炫,而在逻辑清晰、设计合理、边界明确。
先理清题目到底在考什么
实战题通常给一个业务场景(比如“设计一个电商订单系统”“实现不同支付方式”“管理多种图形的面积计算”),要求你写出类结构或解释设计思路。它隐含考察三件事:
- 能不能准确识别现实中的“对象”和它们之间的关系(谁是谁的子类?哪些行为该统一定义?哪些要各自实现?)
- 会不会主动用访问修饰符控制细节暴露(比如金额不能直接改,得走set方法校验)
- 有没有意识用父类型引用接收子类对象(比如用Payment p = new WeChatPay(),而不是WeChatPay p = new WeChatPay())
封装要体现“可控访问”,不是简单加private
光把字段设成private不够,重点是提供有意义的接口。比如用户年龄,不能只写get/set,得加校验逻辑:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- setAge(int age)里判断0–150,非法值抛异常或忽略
- 如果年龄涉及隐私,还可以加isAdult()这类语义化方法,而不是让调用方自己算age >= 18
- 敏感字段如密码,set方法可做哈希处理,get方法返回null或占位符,不暴露原始值
继承和多态要解决“复用+差异化”
别为了继承而继承。真正该用继承的场景是:子类确实是父类的一种,且有共性行为需要统一管理。
- 例如“通知方式”:EmailNotify、SmsNotify、WechatNotify 都继承 Notify 抽象类,共享send()方法签名,各自实现发送逻辑
- 测试时用 Notify n = new SmsNotify() 调用 n.send(),后续加PushNotify也不用改调用方代码
- 如果只是“都有title和content”,但发送机制完全无关,用组合(成员变量)比继承更合适
抽象类和接口选哪个,看你要表达什么
这是高频混淆点。记住一句话:
- 抽象类强调“是什么”——比如Animal是抽象类,Dog/Cat是它的具体种类,它们天然共享呼吸、进食等基础行为(可写默认实现)
- 接口强调“能做什么”——比如Flyable、Runnable,一个无人机可以实现Flyable,一个线程可以实现Runnable,它们没继承关系,但能力可叠加
- Java 8之后接口可有default方法,但状态(字段)仍只能是public static final;抽象类可有普通字段、构造器、protected方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










