高 基础
面向对象特性与重载重写#
一句话答案#
面向对象三大特性:封装(隐藏实现、暴露接口)、继承(复用与扩展)、多态(同一引用不同行为)。重载(Overload)是同类中方法名同、参数不同的编译期静态绑定;重写(Override)是子类覆盖父类同签名方法的运行期动态绑定,多态的实现基础。
核心要点
一、三大特性
| 特性 | 含义 | 关键词 |
|---|---|---|
| 封装 Encapsulation | 隐藏内部实现,通过访问修饰符暴露必要接口 | private 字段 + public 方法 |
| 继承 Inheritance | 子类复用并扩展父类,extends;Java 单继承类、多实现接口 | is-a 关系 |
| 多态 Polymorphism | 父类引用指向子类对象,调用时表现子类行为 | 向上转型 + 动态绑定 |
二、多态的三个前提
- 继承(或实现接口)
- 重写父类方法
- 父类引用指向子类对象(向上转型)
Animal a = new Dog(); // 编译看左(Animal),运行看右(Dog)
a.sound(); // 调用 Dog 重写的方法 —— 动态绑定java- 成员方法:动态绑定(运行期看实际类型)
- 成员变量/静态方法:静态绑定(编译期看声明类型,不具备多态)
三、重载 Overload vs 重写 Override
| 维度 | 重载 Overload | 重写 Override |
|---|---|---|
| 发生位置 | 同一个类(或父子类间) | 子类对父类方法 |
| 方法名 | 相同 | 相同 |
| 参数列表 | 必须不同(个数/类型/顺序) | 必须相同 |
| 返回值 | 可不同(不作为区分依据) | 相同或协变(子类型) |
| 访问修饰符 | 任意 | 不能比父类更严格 |
| 异常 | 任意 | 不能抛更宽的受检异常 |
| 绑定时机 | 编译期(静态绑定) | 运行期(动态绑定) |
| 与多态 | 无关 | 多态的基础 |
注意:返回值类型不同不能构成重载(编译报错),必须靠参数列表区分。
四、重写的约束口诀「两同两小一大」
- 两同:方法名、参数列表相同
- 两小:返回值类型≤父类(协变返回)、抛出异常≤父类
- 一大:访问权限≥父类(不能更严格,如父 public 子不能 protected)
面试回答(2分钟版)
面向对象三大特性是封装、继承、多态。封装是把对象的内部状态隐藏起来,字段用 private,只通过 public 方法暴露必要的操作,好处是降低耦合、保护数据一致性。继承是子类复用并扩展父类,Java 是单继承多实现,类只能 extends 一个父类但能 implements 多个接口。多态是核心,指父类引用指向子类对象时,调用方法表现出子类的具体行为,它有三个前提:有继承或实现关系、子类重写了方法、父类引用指向子类对象。多态的底层靠动态绑定实现,但要注意只有成员方法是动态绑定的,成员变量和静态方法是静态绑定,看声明类型不具备多态。重载和重写经常被放一起考:重载是同一个类里方法名相同但参数列表不同,返回值不能作为重载的区分依据,它是编译期就确定的静态绑定;重写是子类覆盖父类的同签名方法,遵循两同两小一大原则——方法名和参数相同、返回值和异常范围不能比父类大、访问权限不能比父类严格,它是运行期的动态绑定,也是多态的实现基础。一句话区分:重载是横向的同名不同参,重写是纵向的子类覆父类。
追问与易错
追问方向:
- “返回值类型不同能构成重载吗?”→ 不能。重载只看参数列表,仅返回值不同编译报错;重写允许协变返回(返回子类型)
- “成员变量有多态吗?”→ 没有。字段是静态绑定,
Animal a=new Dog(); a.name取的是 Animal 声明的字段 - “静态方法能被重写吗?”→ 不能,叫”隐藏”。静态方法属于类、编译期静态绑定,子类同名静态方法只是隐藏父类版本
- “重写时能抛出比父类更宽的受检异常吗?”→ 不能,只能抛相同或更窄的受检异常(运行时异常不受限)
- “构造方法能重载/重写吗?”→ 能重载(不同参数),不能重写(构造方法不被继承)
- “多态的底层原理?”→ JVM 通过虚方法表(vtable)查实际对象的方法地址,运行期动态分派
易错点:
- ❌ “重载靠返回值区分”——只靠参数列表,返回值不参与
- ❌ “静态方法/private 方法能被重写”——静态是隐藏,private 不可见无所谓重写
- ❌ “子类重写可以缩小访问权限”——访问权限只能放大或相等
- ✅ 重写口诀「两同两小一大」