封装是控制访问与隐藏实现,需配套校验逻辑;继承体现“is-a”关系,支持单继承与protected共享;多态依赖重写与运行时绑定;抽象则支撑接口(定义能力)和抽象类(定义本质与部分实现)的设计逻辑。

直接说清三点:封装、继承、多态,再补一句抽象——不是凑数,而是它支撑接口和抽象类的设计逻辑。
封装:不是“加个private就完事”
封装的本质是控制访问 + 隐藏实现。光把字段设为 private 不够,关键看有没有配套的约束逻辑。比如 Student 类里 age 是 private,但 setter 里必须校验不能为负、不能超 150;name 的 setter 可能要 trim() 和判空。没有业务规则的 getter/setter,只是形式封装。面试时顺带提一句:封装让类成为可验证的独立单元,调用方不用替你操心数据合法性。
继承:重点讲清楚“is-a”和复用边界
子类必须真正属于父类的一种(比如 Dog is-a Animal),而不是为了偷代码硬套。Java 只支持单继承,所以设计时得想清楚:这个共性行为是否稳定?会不会被多个维度拆分(比如“会飞”和“会游泳”就不该塞进同一个父类)。另外,子类能访问父类 protected 成员,但不能访问 private;构造器不继承,但子类构造器第一行默认或显式调用 super() ——这点常被忽略,却是理解对象初始化顺序的关键。
多态:运行时绑定才是核心,不是重载
多态体现在“同一引用,不同行为”,靠的是方法重写(override)+ 向上转型 + 运行时动态绑定。比如 List list = new ArrayList(); list.add(…) 调用的是 ArrayList 的 add,不是 List 接口的——接口没实现,只有声明。面试官如果追问底层,可以提 invokevirtual 指令查虚方法表(vtable)。注意区分重载(overload):那是编译期决定的,和多态无关。常见错误是把方法签名改了但忘了 @Override 注解,导致重写失败却没报错。
抽象:接口与抽象类怎么选
抽象是建模共性的手段。接口强调“能做什么”(Java 8+ 支持 default/static 方法,但不能有构造器、实例字段);抽象类强调“是什么”和“部分怎么做”(可含构造器、成员变量、非抽象方法)。新增功能时,接口加 default 方法兼容性好;需要共享状态或模板逻辑,选抽象类。final 类不能被继承,abstract 类不能被实例化——这两个限制背后,是对设计意图的强制表达。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











