Java基础篇:您真的了解Java中的重载吗?

文编|JavaBuild

哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,厚积薄发!

今天我们来聊一聊Java中的重载,提及重载我们很难不聊两句重写,这是对于初学者十分容易混淆的俩概念,英文中分别用“override(重写)”,“overload(重载)”表示。

无论是英文还是中文表示,我们都会想当然的认为这俩是“孪生兄弟”,但这里给出一个结论:这俩并无太多相似之处,甚至可以用大相径庭来形容。

重写与重载的区别?

重写:类实现接口或者子类继承父类时,保持方法签名相同,用不同的方法体来实现不同的功能,这也是Java三大特性之一多态的具体实现,是垂直方向的“类间行为”。

重载:在同一个类或者父类与子类之间,保持方法名称相同,参数类型,参数数量,参数顺序不同的一种实现,是水平方向上的“类内行为”,同一个类中,或者父子类中。

方法签名

今天我们的主人公是“重载”,并不展开描述重写,后面会单独更一篇重写的哈。在开始话题之前,我们先来了解一下方法签名的概念,所谓方法签名是JVM用来定位方法的唯一索引,由方法名称+参数构成,不包括访问权限控制符、静态标识符、final标识符、异常类型、返回值

重载

重载是发生在编译期间的一种静态绑定,编译器通过方法签名来定位具体重载的哪个方法,如String的valueOf就是一个方法重载的案例典范,上代码!

目前String中valueOf重载的方法已多达十几种,用以实现不同的数据类型转换为字符串的逻辑。

是不是觉得重载很简单?不就是方法名相同的情况下,传入不同参数即可调用不同的重载方法,那么我们看看下面的代码

这时若我们分别调用1、method(),2、method(1),3、method(1L),4、method(null),猜一下答案,嘿嘿

调用1时方法1和方法5均可满足条件(可变参数,参数个数为0或多个),但因为JVM重载方法时优先通过精准匹配进行选择,所以这里会选择方法1;调用2时,方法2、3、4、5均满足,同样因为精准匹配的原因,选择了方法2;调用3时,因为重载方法中没有参数为long类型的,所以会通过子类向上转型继承路线依次匹配,最终调用到了方法4;这里4的调用被注释掉了,原因是报错啦,出现了模糊匹配。

参数null可以匹配任何一个类对象,这里从满足从子类向上转型进行匹配,但在Integer和可变参数的选择上,编译器无法选择,所以编译报错。

由上述的例子其实我们不难看出,在多个重载方法均满足条件时,编译器对于重载的选择是有优先顺序的,下面进行了整理。

编译器选择顺序(从高到底)

  1. 精准匹配
  2. 基本数据类型,自动转换为更大范围的基本类型
  3. 通过装箱与拆箱进行匹配
  4. 通过子类向上转型继承路线依次匹配
  5. 通过可变参数匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaBuild888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值