本文转载自微信公众号「Java极客技术」,关于作者鸭血粉丝Tang。可的解转载本文请联系Java极客技术公众号。变参 我们都知道 Java 支持可变参数的关于形式定义方法,这种语法糖在某些时候可以简化我们的可的解代码,但是变参关于可变参数是如何实现的以及其他的更多细节,你真的关于知道吗?今天阿粉就带你来了解一下。 首先看下可变参数方法在代码上是如何定义的,如下所示: 通过上面的示例,我们可以看出在定义方法时,关于在最后一个形参类型后加上三点 …,可的解就表示该形参可以接受多个相同类型的变参参数值,多个参数值被当成数组传入。关于这里我们需要注意几个点: 上面提到可变参数的形式会被编译成一个数组,那么问题来了,我可不可以写两个下面这样的方法呢? 在一个类中的定义相同名字的一个可变参数的方法和一个包含数组的方法,写完过后我们就发现 IDEA 已经提示我们这种写法的编译不了的了。 从这里我们可以知道可变参数在编译为字节码后,在方法签名中会以数组形态出现的,导致这两个方法的签名一致的,如果同时出现,是不能编译通过的。 可变参数方法的调用跟其他方法的调用没什么区别,这里要说明的是,我们除了通过可变参数进行调用之外,还可以通过传入数组的源码下载形式来进行调用,如下所示: 通过可变参数和数组的形式,这两种调用形式本质上是一样的;另外可变参数的个数也可以为 0。 试想一下如果我们定义了下面这样的两个方法,定义和使用的时候会是什么情况 第一个是只有一个可变参数形参的方法;第二个是一个 String 类型的固定参数和第二个参数是可变参数的方法。首先,定义的时候完全没有问题,IDEA 也没有任何错误提示,编译也不会有问题。 那么在使用的时候呢?比如下面这样的写法会输出什么结果呢? 在看输出结果之前,我们可以看到,main 函数中的调用,其实这两个重载的函数都是云南idc服务商可以满足的,而且编译也没有错,那么程序运行会输出什么呢? 通过实际的运行结果我们可以看到,输出的结果是22222 表示运行的是method2(String value1, String value2) 这个方法,那说明什么问题呢? 说明当存在与可变参数方法形成重载方法的时候的,会优先固定参数的方法进行执行,相信这一点大家应该都从来没有关注过。 写到这里可能有小明要问了,那如果我们第二个方法中的 value2 也是可变参数呢?那这种情况会怎么样呢?为此我们再看一下,下面的这种形式会怎样。 首先定义的时候 IDEA 没有任何错误提示,说明编译是没有问题的,那调用的时候呢? 可以看到这个时候 IDEA 已经提示我们匹配到多个方法合适的方法,不能编译通过,主要是第一个和第三个方式的写法导致的,匹配到了多个可变参数的方法,我们日常开发的时候要注意这个问题。 看到这样有小明就要问了,那我可不可以创建一个基于 Object 的可变参数方法,这样子这个方法不就是可以接受所有类型的参数了吗?就像这样: 首先要说的是,这么定义当然是没有问题的,但是可读性会差很多,调用方完全不知道要传入什么类型;要是真的写了太多像这样的代码,估计维护起来也是害人害己,这么写的小明就好自为之吧,被开除了不要说是看了阿粉写的文章学会的。可变参数方法的可的解定义
可变参数方法的调用
可变参数方法的重载
Object 可变参数