函数
1、函数定义
格式:
fun 函数名(数据类型 形参1,....):返回值类型{
......
return...
}
- 当没有返回值时,直接省略掉":返回值类型"即可或者使用":Unit"声明(Unit相当于Java中的void)代表没有返回值
1.1、形参默认值
除了返回值写法和Java中外,Kotlin中形参允许可以有默认值
针对以上具体函数为例:
fun test(name:String="lelsie",age:Int):Person{
。。。。。。。
return ....
}
当没有返回值时:
fun test(name:String="lelsie",age:Int):Unit{
。。。。。。。
}
或者
fun test(name:String="lelsie",age:Int){
。。。。。。。
}
2、函数调用
java中方法调用时使用位置参数,即形参和实参一一对应,Kotlin除了使用java中这种传统位置参数调用,还可以使用命名参数(“外部形参数名=值”)形式调用,甚至还可以使用这两种混合方式
- 位置参数调用
- 命名参数调用
- 位置参数和命名参数混合调用(所有位置参数必须位于命名参数之前,即命名参数后都是命名参数了)
注意:
- 所有位置参数必须位于命名参数前,即第一个参数如果使用命名参数,那么后面的参数如果要传值(比如后面形参指定了默认值)也必须使用命名参数),特殊情况比如使用命名参数方式这个形参后形参都定义了默认值,调用时也使用默认值即不用传任何值
外部形参:和方法定义的形参名一样
内部形参:方法定义的形参名
fun testName(age:Int=10,name:String,studentNO:Int){
Log.d("TAG","name=${name},age=${age}")
}
调用:testName(name = “leslie”,1)该种方式[第一个参数用命名参数方式,第二个参数不传实参使用默认值,第三参数使用位置参数]即会报错,上面我们说了位置参数必须在命名参数前,这里第一个参数就用名参数方式,所以后面的形参也要赋值时就必须也以命名参数方式:比如:testName(name=“lelsie”,studentNo=12);
如果只使用位置参数调用,但是形参都有默认值情况:
fun testName(name:String=“leslie”,age:Int=10,studentNO:Int=12){
Log.d("TAG","name=${name},age=${age}")
}
调用:testName(1)将报错,因为默认是赋值给第一个参数的,而第一个参数是String类型
- 只传一个值时,默认赋值给第一个形参
- 如果第一个形参有默认值,后面的形参没有默认值,仅只使用位置参数,那么必须为前面的默认值形参传值,否则就会报错,但是这样也就失去默认值的意义;因此如果要要传多个值(但有不是为所有的值传值),必须使用位置参数和命名参数混合的方式如:testName(“lin”,studentNO=20),一般建议将有默认值形参放在最后,这样可以避免只是用位置形参传参时,不用再为默认值形参再重复传值;
2.1、可变形参
形式:vararg 形参名:数据类型
首先,一个方法中最多只能有一个可变形参,但和java中要求不同的是***可变形参可以位于形参任意位置,而不是只能位于形参列表的最后位置***
当可变形参位于形参列表第一个时:后面的其他形参必须使用命名参数方式
fun vararg(vararg books:String,num:String){
for (book in books){
Log.d(“TAG”,book)
}
可变参数实质就是一个数组,当将数组元素传给可变性参时,在数组前添加"*"
3、单表达式函数
函数只返回单个表达式,可以省略{}并在“=”后指定函数体既可。表达式的值即为返回值
如:
fun area(x:Double,y:Double):Double=x*y
4、函数重载
要求:
- 函数名相同
- 参数列表个数不同或者参数列表个数相同但是参数类型不同