最高效掌握重载与重写的方法是通过三类典型代码题反推规则:一、重载看编译时静态绑定,依据引用类型和实参字面量类型;二、重写看运行时动态绑定,须满足“两同两小一大”;三、混合题中重载在同一类,重写在父子类且参数完全一致;四、构造器只可重载不可重写。

直接看代码题,是最高效掌握重载与重写的办法。关键不是背定义,而是从编译报错、运行结果、@Override 是否合法这三类典型题目中,反推出底层规则。
一、重载题:看编译器选哪个方法
这类题考静态绑定——编译时就决定调用哪个重载版本,只看引用类型 + 实参字面量类型,不看对象实际类型。
例如:
class Test {
void print(int x) { System.out.println("int"); }
void print(double x) { System.out.println("double"); }
void print(Object x) { System.out.println("Object"); }
}
Test t = new Test();
t.print(5); // 输出 int(字面量5是int)
t.print(5.0); // 输出 double(5.0默认是double)
t.print(null); // 编译错误!歧义:Object和int/double都可接受null?不,int和double不能接收null,所以实际匹配到Object → 输出 Object
常见陷阱题:
-
add(10, 20.0) 和 add(20.0, 10) 同时存在 → 编译通过;但 add(10, 20) 如果只有
add(int,double)和add(double,int)两个重载 → 报错 Ambiguous method call -
可变参数方法 是重载的“兜底选项”:当没有精确匹配时,才考虑
void f(int... a),且它优先级最低
二、重写题:看子类能否合法覆盖父类方法
这类题考动态绑定+重写约束,核心是判断子类方法是否满足“两同两小一大”:
- 两同:方法名相同、参数列表完全一致(类型、数量、顺序)
-
两小:返回类型 ≤ 父类(协变,如父类返回
Animal,子类可返回Dog);抛出异常 ≤ 父类(不能新增Exception,但可缩小为IOException) -
一大:访问权限 ≥ 父类(
protected可重写default,但private方法不能被重写)
典型错例:
class A {
protected String show() { return "A"; }
}
class B extends A {
private String show() { return "B"; } // ❌ 编译失败:权限变小
public int show() { return 1; } // ❌ 编译失败:返回类型不兼容(int ≠ String 且非其子类)
public String show() { return "B"; } // ✅ 正确重写
}
三、混合题:父子类里既有重载又有重写,怎么分辨?
这是面试高频混淆点。记住一句话:重载发生在同一个类内部;重写发生在父子类之间,且必须参数完全一致。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
看这个经典结构:
class Parent {
public void work() { System.out.println("Parent work"); }
public void work(String s) { System.out.println("Parent work with str"); }
}
class Child extends Parent {
@Override
public void work() { System.out.println("Child work"); } // ✅ 重写
public void work(int n) { System.out.println("Child work with int"); } // ✅ 重载(在Child类内,与继承来的work()构成重载)
public void work(String s, int n) { System.out.println("Child work with str+int"); } // ✅ 重载
}
验证方式:
- 去掉
@Override,仍能编译 → 很可能是重载(或隐藏) - 加上
@Override后编译失败 → 肯定不是重写(参数/名字/可见性/返回值违规) - 运行时多态表现:用
Parent p = new Child(); p.work();输出 Child work → 说明是重写生效;而p.work("x")调用的是父类版本 → 因为子类没重写它,只是继承
四、构造器题:构造方法也能重载,但不能重写
构造器没有返回类型,不能被继承,因此不存在重写,只存在重载。
例如:
class Person {
Person() { System.out.println("no-arg"); }
Person(String name) { System.out.println("name: " + name); }
Person(int age) { System.out.println("age: " + age); }
}
// 下面代码合法,全是重载:
new Person();
new Person("Alice");
new Person(25);
// 下面写法在子类中是构造器重载,不是重写:
class Student extends Person {
Student() { super(); } // 调父类无参
Student(String name) { super(name); } // 调父类String构造
Student(String name, int id) { this(name); System.out.println("id: " + id); } // this()调本类重载构造
}
注意:super(...) 或 this(...) 必须是构造器第一行语句,这也是识别构造器重载的关键线索。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










