函数的参数分为具名参数、默认参数以及可变参数3种,接下来我们通过一些案例来分别解释这3种参数。
具名参数
具名参数,顾名思义就是指在调用函数时显示指定形参的名称,这样即使形参和实参的顺序不一致也不会有任何影响,因为已经明确指定了每个形参对应的实参,这样有助于提高代码的可读性。具名参数的语法格式如下:
函数名称(形参1=实参1,形参2=实参2,形参3=实参3…)
- 形参:全称为“形式参数”,由于它不是实际存在的变量,因此又称虚拟变量,是在定义函数名和函数体时使用的参数,目的是用于接收调用该函数时传入的参数。在调用函数时,实参将赋值给形参。
- 实参:全称为“实际参数”,是在调用时传递给函数的参数。实参可以是常量、变量、表达式、函数等,无论实参是什么类型,在进行函数调用时,实参必须具有确定的值,以便把该值传递给形参,因此可提前用赋值、输入等方法使实参获取确定的值。
接下来我们通过一个例子来解释具名参数,具体代码如下所示。
package com.itheima.chapter03
fun info(name: String, age: Int) {
println(" 姓名:$name") //打印传递的姓名
println(" 年龄:$age") //打印传递的年龄
}
fun main(args: Array<String>) {
info(name = "江小白", age = 20) //调用info() 函数,指定函数中的形参与实参
}
运行结果:
姓名:江小白
年龄:20
上述代码中,通过fun关键字声明了一个函数info(),在该函数中传递了两个参数,分别为String类型的name和Int类型的age,在该函数的函数体中通过println()语句打印了参数name和age的值。
在main()函数中调用了info()函数,在调用的同时指定了该函数的形参和实参,其中形参是name和age,实参是“江小白”与20,将实参“江小白”赋值给形参name,将实参20赋值给形参age。在调用函数info()时,传递的两个参数的顺序可以不固定,可写为info(name="江小白", age=20)
,也可写为info(age=20, name="江小白")
,但是在实际开发中会按照形参顺序传递对应的实参,这样更利于代码的阅读和理解。
默认参数
默认参数,是指在定义函数时,可以给函数中的每一个形参指定一个默认的实参,默认参数的语法格式具体如下:
fun 函数名(形参1: 类型,形参2: 类型= 默认值…) {
函数体
…
}
上述语法格式中,给形参2指定了一个默认的实参,这个实参是一个确定的值。
接下来我们通过一个案例来讲解如何设置默认参数,具体代码如下所示。
package com.itheima.chapter03
fun introduce(name: String = "江小白", age: Int) {
println(" 姓名:$name") //打印传递的姓名
println(" 年龄:$age") //打印传递的年龄
}
fun main(args: Array<String>) {
introduce(age = 20) //调用introduce() 函数,并指定函数中的形参与实参
}
运行结果:
姓名:江小白
年龄:20
在上述代码中,将introduce()函数传递的形参name赋了一个默认的值“江小白”。此时在main()函数中调用introduce()函数时,可以不用指定形参name的实参,直接传递形参age的实参即可。如果在调用introduce()函数时,显示指定了形参name的实参,则程序的运行结果中的姓名是在调用该函数时传递的name对应的实参。
当定义一个函数时,如果没有设置该函数的默认参数,则调用该函数时必须传递具体的实参。如果定义一个函数时,函数中设置有默认的参数,则调用该函数时可以不用传递具体实参,不传递实参的情况下,函数会使用默认参数。
可变参数
可变参数,是指参数类型确定但个数不确定的参数,可变参数通过vararg关键字标识,我们可以将其理解为数组。可变参数通常声明在形参列表中的最后位置,如果不声明在最后位置,那么可变参数后面的其他参数都需要通过命名参数的形式进行传递。接下来我们通过一个案例来认识可变参数,具体代码如下所示。
package com.itheima.chapter03
fun sum(name: String, vararg scores: Int) {
var result = 0
scores.forEach {
result += it
}
println(" 江小白的总成绩:" + result)
}
fun main(args: Array<String>) {
sum("江小白", 100, 99, 98, 100, 96)
}
运行结果:
江小白的总成绩:493
在上述代码中,声明了一个sum()函数用于求总成绩,在该函数中传递了一个String类型的参数name与一个可变参数scores。由于可变参数可以当作数组处理,因此可以使用forEach循环遍历scores中的值,循环中的it表示每次遍历scores中的元素,然后将这些元素累加并赋值给result,输出总成绩。当在main()方法中调用sum()函数时,需要传递一个String类型的实参,以及任意多个Int类型数据,即可得出某人的总成绩。
由于可变参数实质上就是数组,因此,可以直接使用数组存放可变参数,在传递时使用数组即可,这样更加直观方便。具体示例代码如下:
var scores: IntArray = intArrayOf(100, 99, 98, 100, 96)
sum("江小白", * scores)
需要注意的是,在实参中传递数组时,需要使用“*”前缀操作符,意思是将数组展开,它只能展开数组,不能展开集合。
可变参数相对来说比较复杂,当可变参数不在形参列表中的最后位置时,其他形参该如何通过命名参数进行传递呢?接下来我们再通过一个案例演示一下,具体代码如下所示。
package com.itheima.chapter03
fun sum(vararg scores: Int, name: String) {
var result = 0
scores.forEach {
result += it
}
println(" 江小白的总成绩:" + result)
}
fun main(args: Array<String>) {
sum(100, 99, 98, 100, 96, name = " 江小白")
}
运行结果:
江小白的总成绩:493
Kotlin中的可变参数与Java中的可变参数的对比
Kotlin中可变参数规则:
- 可变参数可以出现在参数列表的任意位置;
- 可变参数是通过关键字vararg来修饰;
- 可以以数组的形式使用可变参数的形参变量,实参中传递数组时,需要使用
“*”
前缀操作符。
Java中可变参数规则:
- 可变参数只能出现在参数列表的最后;
- 用
“…”
代表可变参数,“…”
位于变量类型与变量名称之间; - 调用含有可变参数的函数时,编译器为该可变参数隐式创建一个数组,在函数体中以数组的形式访问可变参数。
可变参数的特点是参数个数不确定,类型确定的参数。Kotlin中把可变参数当作数组处理。接下来我们通过一个案例来认识可变参数,具体代码如下所示。
package com.itheima.chapter03
fun add(vararg arr: Int): Int {
var sum = 0 //定义一个变量sum
arr.forEach { //对可变参数进行遍历
sum += it //每循环一次会加上可变参数arr 中的值
}
return sum //循环结束,返回参数值的和
}
fun main(args: Array<String>) {
var result = add(1, 2, 3) //调用 add() 函数,并把该函数的返回值赋给变量result
println(result) //打印变量result
}
运行结果:
6
在上述代码中,通过fun关键字声明了一个函数add(),在这个函数中传递了一个可变参数arr,该可变参数由关键字vararg来修饰,同时该可变参数的类型指定为Int。由于可变参数本质上是一个数组,因此可变参数可以通过forEach()循环进行遍历。在forEach()函数中,it表示每次遍历的可变参数arr中的元素,每循环一次都会加上it的值,加完之后将最终的值赋给变量sum。在main()函数中调用add()函数,并向该函数传递3个Int类型的数据,分别是1、2、3,这3个数据会以数组的形式存放在可变参数arr中,在这里传递的数据的个数是任意的。接着将add()函数的返回值赋给变量result,最后打印变量result。
酷客教程相关文章:
评论前必须登录!
注册