编译器优先匹配基本类型版本。Java方法重载解析第一阶段仅考虑无装箱/拆箱/可变参数的精确匹配,实参静态类型与形参完全一致(如int字面量匹配int形参)即确定调用,不进入后续阶段;包装类仅在基本类型无匹配时才被考虑。

编译器优先匹配基本类型版本。
精确匹配阶段就决定了结果
Java 方法重载解析分三个严格阶段,第一阶段只考虑不发生装箱、拆箱和可变参数的精确匹配。只要存在参数类型与实参静态类型完全一致的方法(比如传 int 字面量 5,而方法形参是 int),编译器立刻选中它,不会进入后续阶段。
- 例如:
void f(int x)和void f(Integer x)同时存在时,调用f(5)一定走int版本 - 即使
Integer版本逻辑更符合业务意图,编译器也不会“绕开”基本类型去选它
包装类只在基本类型不可用时才被考虑
只有当第一阶段找不到任何精确匹配(比如删掉了 f(int)),编译器才会进入第二阶段,允许装箱——这时 5 才会自动装箱为 Integer 去匹配 f(Integer)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 注意:
null无法确定该装成哪个包装类(Integer?Long?),此时若同时存在多个包装类重载,直接报错 reference to method is ambiguous - 用
var a = 10;声明后传参,实际类型是Integer,可能意外触发包装类版本,而非你预期的基本类型逻辑
基本类型和包装类属于不同参数类型
虽然它们语义相关,但在重载判定中被视为完全不同的类型。编译器不会因为 int 和 Integer “看起来像”就模糊处理,而是严格按静态类型比对。
立即学习“Java免费学习笔记(深入)”;
-
int是基本类型,Integer是引用类型,二者无继承关系 - 返回类型、修饰符、异常声明都不参与重载判断,只看参数列表本身
- 所以
void g(int x)和void g(Integer x)构成合法重载,但调用行为高度依赖实参写法

















