Kotlin 函数的参数

函数的参数分为具名参数默认参数以及可变参数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。

酷客教程相关文章:

赞(1)

评论 抢沙发

评论前必须登录!