重载是编译时同名多版本选择,发生在同一类;重写是运行时子类替换父类方法,依赖继承关系。equals(person)是重载,非重写;仅改返回值、修饰符或static方法均不构成有效重载或重写。

重载与重写的核心定位必须分清
面试官一开口问“重载和重写区别”,不是考你背定义,而是看你是否真懂它们在Java多态体系里的分工:重载是编译时决定的同名多版本选择,发生在同一个类(或父子类中,但本质仍是类内视角);重写是运行时动态绑定的子类行为替换,只存在于继承关系中,是多态落地的关键机制。
高频陷阱题:equals 方法到底算重载还是重写?
这是面试必挖的坑。看这段代码:
public class Person {
public boolean equals(Person other) { // 注意参数是 Person,不是 Object
return this.name.equals(other.name);
}
}
它不是重写 Object.equals(),而是对父类方法的重载——因为参数类型不同(Person vs Object)。结果是:当用 Object o = new Person(); o.equals(new Person()) 调用时,走的是 Object.equals() 默认实现(地址比较),不是你写的逻辑。正确重写必须严格匹配签名:public boolean equals(Object obj)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
综合判断题:哪些情况既不构成重载也不算重写?
以下操作均不成立,常作为干扰项出现在选择题或代码纠错题中:
- 仅改变返回值类型(如
int getValue()和String getValue())→ ❌ 不是重载,编译报错 - 仅修改访问修饰符(如父类
protected void run(),子类private void run())→ ❌ 不是重写,权限非法 - 子类写了个
static void show(),父类有void show()→ ❌ 不是重写,static 方法只能被隐藏(hiding) - 在同一个类里定义
void test(int a)和void test(Integer a)→ ⚠️ 看似重载,但自动装箱可能引发歧义,实际编译通过但运行时行为需谨慎验证
实战编码题:手写一个体现重载+重写协同的动物系统
要求:Animal 是父类,有 move() 可被重写;Dog 类继承 Animal,同时提供多个 bark() 重载版本(无参、带音量、带持续时间),并在主方法中体现多态调用。
关键点考察:
- 子类
Dog.move()正确重写父类方法(@Override + 签名一致 + 权限不降级) -
bark()多个版本参数列表明显不同(个数/类型),体现重载设计意图 - 测试中用
Animal a = new Dog()调用move()→ 触发重写(运行时多态) - 用
Dog d = new Dog()调用不同bark(...)→ 编译期根据实参选择重载版本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










