JavaSE之方法重载(可变参与包装类调用问题)

目录

一、重载定义

二、重载问题

2.1、复杂重载案例

2.2、重载调用顺序

2.3、延伸思考


一、重载定义

在同一个类中,如果多个方法拥有相同的名字、不同的参数,即称为方法重载。String类中的valueOf()就是比较著名的重载案例,可以将输入的基本数据类型、数组、Object等转换成字符串。

在JVM眼中,方法名称+参数类型+参数个数,组成一个唯一键,成为方法签名。JVM通过这个唯一键决定调用那个方法。如

public class OverloadMethods {
    /**
     * 1.无参
     */
    public void overloadMethod(){
        System.out.println("无参方法");
    }

    /**
     * 2.基本数据类型
     */
    public void overloadMethod(int param){
        System.out.println("基本数据类型为int的方法");
    }

}

二、重载问题

2.1、复杂重载案例

上例中很容易判断调用哪种重载方法,但是当加入包装类和可变参时,会如何呢,见下例子,调用overloadMethod(7)。

public class OverloadMethods {
    /**
     * 1.无参
     */
    public void overloadMethod(){
        System.out.println("无参方法");
    }

    /**
     * 2.基本数据类型
     */
    public void overloadMethod(int param){
        System.out.println("参数为基本数据类型int的方法");
    }

    /**
     * 3.包装类
     */
    public void overloadMethod(Integer param){
        System.out.println("参数为包装类Integer的方法");
    }

    /**
     * 4.可变参,可接收0~n个Integer参数
     */
    public void overloadMethod(Integer... param){
        System.out.println("可变参方法");
    }

    /**
     * 5.Object参数
     */
    public void overloadMethod(Object param){
        System.out.println("参数为Object的方法");
    }

}

调用overloadMethod(7),到底会调用谁呢?答案是2,参数为基本数据类型int的方法。

2.2、重载调用顺序

JVM在重载方法中,选择合适的目标方法的顺序如下:

精确匹配

如果是基本数据类型,自动转换成更大范围的基本类型

通过自动拆箱与装箱

通过子类向上转继承路线依次匹配

通过可变参数匹配

精确匹配优先,int和Integer胜出,因为不需要自动装箱,因此overloadMethod(7)会调用int参数的方法。如果是new Integer(7),Integer参数的方法将胜出。

如果本方法只有overloadMethod(long param),则可接收overloadMethod(7)的实参调用;反之,如果只有overloadMethod(int param),而传入long值,则会编译出错。基本数据类型转化为表示范围更大的基本数据类型优先于自动装箱,即int转为long,优先于自动装箱。

如果一个类中只有overloadMethod(Object param)和overloadMethod(Integer...param)两种方法,根据目标方法匹配顺序,overloadMethod(7)先自动装箱,然后向上转型,匹配Object。这个规则优先于调用可变参的重载方法。

如果调用overloadMethod(null),则会调用参数为Integer的方法。null可以匹配任何对对象,在查找目标方法时,是从最底层子类依次向上查找的。Integer是Object的子类,所以会先与Object匹配。

根据上次匹配顺序,可变参数在竞争中明显处于弱势地位。如果调用overloadMethod(13,14),此时有两个参数,虽然有自动装箱的开销,但可变参数仍会执行这种方法请求。

2.3、延伸思考

由上所述,7是匹配基本类型优先,new Integer(7)是匹配包装类优先,那么如下定义会怎样呢?

    public void overloadMethod(int param1, Integer param2){
        System.out.println("可变参方法");
    }

    public void overloadMethod(Integer param1, int param2){
        System.out.println("可变参方法");
    }

如上定义编译是可通过的,也是一种重载方式。但是此时调用overloadMethod(7,8)会出现调用出错(Ambiguous method call. Both两者都匹配,引用不明确)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值