重载由编译器静态解析,重写由JVM动态分派;重载测试聚焦类型转换、装箱拆箱、varargs歧义等编译期绑定场景,重写测试验证多态调用、协变返回、访问权限放宽及异常收缩规则。

测试方法重载与重写,关键不是“穷举所有可能”,而是抓住编译期与运行期的分界点——重载由编译器静态解析,重写由JVM动态分派。真正需要覆盖的边界,是那些容易让IDE不报错、但逻辑出错或行为异常的场景。
重载测试:重点验证编译器选法是否符合预期
重载在编译时就确定调用哪个方法,所以测试要模拟不同参数组合下的实际绑定结果,尤其关注自动类型转换、装箱拆箱、可变参数和null值歧义:
-
基本类型宽化与窄化边界:比如定义了
void f(int)和void f(long),传入byte b = 1或short s = 2,确认调用的是int版本(因宽化优先于装箱);再传1L确认落到long版本 -
装箱与原始类型混用:声明
void g(Integer)和void g(int),传null会编译失败(歧义),必须显式转型如g((Integer) null)或g(0) -
可变参数的“兜底”行为:当存在
void h(String...)和void h(String),传入"a"应调用后者;传入new String[]{"a","b"}才进前者;避免误以为 varargs 总是被优先选择 -
参数顺序变化但类型重复:如
f(int, String)和f(String, int)是合法重载,但若只写了f(a, b)且a、b类型恰好可互换(如都是Object),需检查是否真能区分——此时可能因类型擦除或泛型推导引发意外
重写测试:重点验证运行时多态是否真实生效
重写测试的核心是“用父类引用指向子类对象”,观察调用是否真的走入子类实现,同时检验访问控制、返回类型协变、异常约束等规则是否被严格执行:
-
向上转型后的调用路径:写
Animal a = new Dog(); a.eat();,确保输出是Dog的版本;再用反射获取a.getClass()验证运行时类型确实是Dog -
协变返回类型的兼容性:父类定义
Animal getPet(),子类重写为@Override Dog getPet(),测试赋值Dog d = sub.getPet();是否编译通过,且运行时不抛ClassCastException -
访问权限放宽的实测:父类中
protected void move(),子类改为public void move(),确认外部类可通过子类实例调用,但不能通过父类引用调用(除非本身有访问权限) -
异常收缩规则验证:父类方法声明
throws IOException,子类重写为throws FileNotFoundException(是其子类)或不抛异常,尝试捕获并确认编译不报错;反之若子类加了throws Exception,应编译失败
混合场景与易忽略陷阱
真实项目中重载和重写常共存,测试需覆盖它们交叉影响的角落:
-
重载方法内部调用重写方法:例如父类有
log(String)和log(Object),都调用doLog()(被子类重写)。测试时分别传"msg"和new Object(),确认两次都触发子类的doLog() -
@Override 注解缺失却不报错的情况:比如子类方法名拼错一个字母,或参数类型写成
Integer而父类是int,此时不是重写而是新方法——必须用单元测试断言该方法未被调用,或通过字节码工具(如 jclasslib)查看是否生成了ACC_FINAL或ACC_SYNTHETIC标记 -
static 方法的“伪重写”:父类
static void init(),子类也写static void init(),测试时用Parent p = new Child(); p.init();会调用Parent.init(),而非子类的——这是隐藏(hiding),不是重写,务必用Child.init()显式调用并断言行为差异
自动化建议:用断言+字节码辅助验证
仅靠运行结果不够,有些错误编译期就该暴露:
- 用 JUnit5 的
@Test(expected = CompileTimeError.class)不现实,改用 Maven 编译插件(如maven-compiler-plugin)配合failOnError=true,再结合 CI 流程拦截非法重写 - 对关键重写方法,写一个简单字节码检查:用
javap -c查看子类 class 文件,确认对应方法有invokespecial(构造器/私有)还是invokevirtual(重写)指令 - 对重载方法,打印
Thread.currentThread().getStackTrace()在各重载体中,运行时看哪条堆栈被触发,比单靠返回值更直观
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











