多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### Kotlin相比于Java | 相比于java | 描述                  | | ------- | ------------------- | | 新增      | 默认参数,形参定义带上默认值      | | 优化      | 命名参数+默认参数,取代繁琐的重载   | ### [默认参数](http://www.kotlincn.net/docs/reference/functions.html#默认参数) 什么是默认参数?就是,我们**在函数定义的时候,可以给每一个形参,选择性的给一个默认实参**。默认参数定义格式如下: ![](https://box.kancloud.cn/c4545e72eace676fcffeecd63fd345b4_679x311.png) 我们举一个具体的方法定义的例子,代码如下: ![](https://box.kancloud.cn/3885261ab45804b598bb0618fb3d0245_701x226.png) 那如果一个函数,有默认参数我们可以该怎么调用呢?参考代码: ![](https://box.kancloud.cn/7ab1d8f85dda45a84ab8308f5d1dc4b2_687x645.png) 针对以上代码,得到些什么结论呢? * 第一,如果方法定义的时候,没有默认参数,方法调用的时候必须传递具体的实参。 * 第二,如果方法带有默认参数,方法调用的时候可以不用传递具体实参,不传递实参的情况下,方法使用默认参数。 我们更进一步,**默认参数+命名参数,可以传递指定位置的参数**。比如,我们传递参数1、3、5,代码如下: ![](https://box.kancloud.cn/1cd70a5f51298208f8b1452a80cc14f3_683x902.png) 针对以上代码我们发现,默认参数和命名参数结合起来之后,方法参数多,可以组合出多种调用方法。 如果在Java里面,需要重载好多的方法,才能完成多种形式的调用。 所以,**【Kotlin相比于Java,通过默认参数加命名参数,减少了方法的重载,写一个方法,可以有多种调用形式】**。 * 关于默认参数和命名参数有如下2个注意的地方。 **第一,带默认参数的方法,如果不使用命名参数,只能从头开始赋值。也就是赋值参数1、参数12、参数123、参数1234、参数12345。如果想参数124、参数125之类的是不行的**,参考代码: ![](https://box.kancloud.cn/be54d48616cb6b8a7bcd696cdca76416_689x375.png) 针对以上代码,我们看到第24行,26行的调用,编译器都当我们传递的第三个参数是参数3,而不是我们想的参数4和参数5。 **第二,带默认参数的方法,某一个参数使用了命名参数,后面的参数赋值都需要使用命名参数**。参考代码: ![](https://box.kancloud.cn/9725d4974e095dfa255e11095ee2bca9_681x529.png) 针对以上代码,**第二个参数使用了命名参数,后面不管想传递参数3还是参数4还是参数5,都需要使用命名才是才能识别了**。 * 第三,**如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用[命名参数](http://www.kotlincn.net/docs/reference/functions.html#命名参数)调用该函数来使用**: 如下图 ![](https://box.kancloud.cn/a5a7a69a3d7fde238dfb1b4d79fabea1_979x301.png) ~~~ fun httpResponse(IsConnect: Boolean = true, httpCode: Int, response: String): Unit { println("IsConnect:${IsConnect}, "+"httpCode:${httpCode}, "+"response:${response}") } ~~~ 第一个参数有默认参数true,而第二个参数没有默认参数,上图中红色标记的①是正确操作,红色标记②确实错误,idea编辑器也提示我们`The integer literal does not conform to the expected type Boolean`,编辑器以为我们传递的是第一个参数IsConnect,所以如果我们要传入第二、第三个参数只能通过命名参数的方式,即 ~~~ httpResponse(httpCode = 404,response = "Successful") ~~~ * 第四、**如果在默认参数之后的最后一个参数是[lambda 表达式](http://www.kotlincn.net/docs/reference/lambdas.html#lambda-表达式语法),那么它既可以作为命名参数在括号内传入,也可以在[括号外](http://www.kotlincn.net/docs/reference/lambdas.html#将-lambda-表达式传给最后一个参数)传入**: