方法重载是同类中同名不同参,编译期按参数列表绑定;方法重写是父子类中同名同参换实现,运行时动态绑定。二者发生位置、判定时机、参数要求及@override使用均不同。

方法重载和方法重写是 Java 面试高频考点,关键不在背定义,而在能一眼分清场景、规则和典型陷阱。下面用贴近面试现场的方式,直接举例说明。
方法重载:同一类里“同名不同参”
重载发生在同一个类中,核心是编译器靠参数列表(类型、个数、顺序)选方法,和返回值、修饰符、异常都无关。
-
合法重载示例:
class Calculator {
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; }
public int add(int a, int b, int c) { return a + b + c; }
public String add(String a, String b) { return a + b; }
}
调用add(1, 2)→ 第一个;add("a", "b")→ 最后一个;编译期就确定了。 -
常见错误(面试常问):
仅改返回类型(如int show()和String show())→ 编译失败;
仅改访问修饰符(private void run()和public void run())→ 不构成重载;
参数顺序不同但类型相同(void f(int a, int b)和void f(int b, int a))→ 仍不构成重载(参数列表实质相同)。
方法重写:子类里“同名同参换实现”
重写发生在父子类继承关系中,目的是运行时多态——父类引用指向子类对象,调用的是子类重写后的方法。
-
合法重写示例:
class Animal {
public void speak() { System.out.println("Animal sound"); }
}
class Dog extends Animal {
@Override
public void speak() { System.out.println("Woof!"); }
}Animal a = new Dog(); a.speak();→ 输出Woof!(运行时决定)。 -
必须遵守的硬约束(面试必答):
方法名、参数列表、返回类型(或协变子类型)必须完全一致;
子类访问权限不能比父类更严格(protected可重写public,但不能反过来);
子类不能抛出比父类更宽泛的检查异常;private、static、final方法无法被重写(static是隐藏,不是重写)。
对比记忆口诀(面试快速应答用)
- 发生位置:重载在同类,重写在父子类;
- 判定时机:重载看编译期参数,重写看运行时对象;
- 参数要求:重载必须参数不同,重写必须参数相同;
- @Override 注解:只能用于重写,加了会帮编译器校验签名,不加不报错但不推荐。
一个类里同时出现重载与重写的典型场景
比如子类既重写了父类方法,又在自己内部重载了同名方法:
- class Goods { public double getPrice() { return weight * 20; } }
-
class CheapGoods extends Goods {
// ✅ 重写父类 getPrice()
@Override public double getPrice() { return weight * 10; }
// ✅ 同时重载:本类新增 setWeight(int) 和继承来的 setWeight(double) 构成重载
public void setWeight(int w) { this.weight = w; }
}
这种混合写法很常见,也容易成为追问点——比如问“子类里的 setWeight(int) 是重载还是重写?”答案是:它和父类的 setWeight(double) 参数不同,属于重载;它和父类无同名同参方法,所以不是重写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











