前言
重载是方法名相同,但是参数列表成分不同… 但是为什么只能是参数列表? 别的成分能否区分重载方法?不能的原因是什么? 本篇文章主要想记录一下,方法重载的区分为什么只能用参数列表! 以及参数列表中区分重载方法,一旦涉及类型转换会怎么样?
1.按照参数列表进行重载分类
- 每个重载的方法都必须有一个独一无二的参数列表
- 这里甚至包括了参数的顺序 ! 相同的参数类型,不同的顺序,也叫方法重载(但是一般不推荐这样使用,代码会很难维护。。)
- 那么来个骚的:“你知道下面这行代码会输出什么吗?”
- 答案是:输出int
- 但是如果将参数为int类型的方法注释掉,那么Integer参数是能接受传的基本类型的(自动装箱)
- 为什么参数默认是int接收,而不是Integer呢?如果传一个Integer会是谁接收?答案是Integer接收Integer
- 那么再来个更骚的:如果一个是Integer搭配int,另一个是int搭配Integer,如果传两个say(1 , 1)会怎么样?
- 编译会出错!这就是聪明的编译器,它这个时候懵了,因为匹配到了两个重载方法…于是不干了!!
来了几个骚例子开开胃,接下来我们正式来看看方法重载!
1.1 涉及基本类型的重载
-
就像上面的例子:基本类型自动装箱,转为包装类型,这其中一旦涉及了方法重载,就会容易造成一些混淆 -
总结一下步骤如下: step1: **一般基本类型,都是默认先找有没有对应的基本类型; step2: 如果没有相同的基本类型,那么就会按照“扩展转换”去找有没有比自己更够记录更多信息的类型,能够承载自己实参的值。 step3:如果还是没有的话,再找有没有对应的包装类型!(一定是对应的包装类型。。这里不存在扩展转换的说法…int不能通过Float类型承载)
关于什么是扩展转换,以及什么是窄化转换,在我的Java编程思想读书总结中也有汇总,详细参考 文章 的#3.4
另外:(char比较特殊!找不到自己对应的char类型,它会再尝试去找int类型,int都找不到那么会去找再扩展的类型long,没有long的话,会考虑浮点类型,先找float再找double,如果还是没有才会去试着找Character【如下图】)
下面是char转int 下面是char转float
1.2 重载涉及的窄化转换
- 因为当时说了,编译器不会替我们承担精度丢失的风险,除非我们截尾,或者舍入的方式放弃精度,进行窄化转换。因此如果没有手动的操作,编译器是不会编译通过的!(如图)
除非我们进行手动截尾、或者舍入(我这里就截尾吧)
1.3 重载涉及包装类型向基本类型转换
- 包装类型转基本类型就是上面讨论的,#2(涉及基本类型的重载)的反向操作
- 就像下面这个Integer :(1.会先找参数为Integer的;2.再找Integer对应的基本类型int,3.再找int基本类型的扩展转换的long,float或者double【先找long,不行找float,再找double】)
2.不可以按照方法的返回值区分重载方法
- 这点非常好理解:假如可以按照返回值来区分重载方法,假如一个方法A返回值是String类型,另一个返回void,那么我调用A的时候:
- (站在程序员的角度)我想调用有String返回值的A方法,但是又不想去处理这个返回值,因此仅仅调用A方法,但是不存储返回的值。。
- (那么这个时候,站在编译器的角度)它根本不知道你原来是想用String返回值的A方法,他只知道一调用了A方法仅此而已。。因此它模棱两可,这个时候就会出现编译错误。
- 因此是不会存在按照方法返回值来区分重载方法的!
3.不可以按照方法的权限控制区分重载方法
【end】
|