Java方法重载匹配优先级为:1.精确匹配;2.基本类型向上转型(byte→short→int→long→float→double,char→int→long→float→double);3.装箱/拆箱;4.可变参数。

Java中方法重载时,当实参是基本类型而没有完全匹配的重载方法,编译器会按固定顺序尝试向上转型(widening conversion)来寻找最合适的候选方法。这个过程不是“看哪个父类更近”,而是严格遵循类型精度层级和转换路径的确定性规则。
基本类型向上转型的优先级顺序
Java规定了基本类型间自动提升(widening)的唯一、不可逆路径,优先级由高到低如下:
-
byte→short→int→long→float→double -
char→int→long→float→double
注意:char 和 byte、short 之间不互相转换,它们都只能先升为 int;boolean 不参与任何数值转换。
编译器会从实参类型出发,沿这条路径逐级尝试匹配——最先能成功匹配上的那个重载方法就被选中,不会继续往下找。
立即学习“Java免费学习笔记(深入)”;
例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
void m(byte x) { System.out.println("byte"); }
void m(short x) { System.out.println("short"); }
void m(int x) { System.out.println("int"); }
void m(long x) { System.out.println("long"); }
m((byte)10); // 精确匹配 → "byte"
m((short)10); // 精确匹配 → "short"
m(10); // int字面量 → 匹配 m(int) → "int"
m(10L); // long字面量 → 匹配 m(long) → "long"再看一个关键例子:
void f(int x) { System.out.println("int"); }
void f(long x) { System.out.println("long"); }
f(5); // 输出 "int" —— 因为 int 字面量优先匹配 int 参数,不走转型但如果删掉 f(int):
void f(long x) { System.out.println("long"); }
f(5); // 此时 5 是 int,但无 int 方法,于是自动提升为 long → 输出 "long"为什么 char 实参可能调用 int 方法而不是 Character
void g(char c) { System.out.println("char"); }
void g(int i) { System.out.println("int"); }
g('a'); // 输出 "char" —— 精确匹配优先
// 注释掉 g(char)
g('a'); // 输出 "int" —— char 自动提升为 int(不是 Character!)这里的关键是:char → int 是 widening conversion,属于第二优先级;而 char → Character 是装箱(boxing),属于更低优先级(第三级)。所以即使有 g(Character),只要存在 g(int),就一定选 int。
多参数时的匹配逻辑
每个参数独立按上述规则匹配,最终选出所有参数都可匹配且整体最具体的方法。如果两个方法对不同参数各有优势(比如方法A在第一个参数上更匹配,方法B在第二个参数上更匹配),编译器无法判断优劣,就会报错:reference to xxx is ambiguous。
例如:
void h(int a, long b) {}
void h(long a, int b) {}
h(1, 2); // 编译错误:两个方法都需要一次 widening,无法决定哪个更优总结判断步骤(按顺序)
- 检查是否存在参数类型与实参完全一致的方法 → 有则直接选
- 否则,对每个实参,按 widening 路径尝试向上转型,找第一个能匹配的重载方法
- 所有参数都能匹配的候选方法中,选择转型总代价最小的那个(即各参数转型步数之和最少;若相同,则看是否某参数无需转型)
- 若仍有多个同等匹配的方法 → 编译失败,提示歧义
这个过程发生在编译期,是静态分派,和运行时对象的实际类型无关。

















