欢迎前往我的CSDN
函数是指有名称的一段代码块,能执行和名称相关的功能,函数用于将程序分解为不同的子模块。 它使代码可重用,并使程序更易于管理。
函数的定义和使用
函数的声明
例如数学中我们计算求和就是一种函数,给出两个数字我们就能计算出它们的和,在kotlin中实现如下:
private fun sum(a: Int, b: Int): Int {
return a + b
}
根据例子我们可有分析出函数的语法格式如下:
修饰符 fun 函数名(参数:参数类型,...): 返回值 {
代码块
}
注意:
- kotlin中函数的修饰符为public,同时public可有省略。
- 在函数没有返回值时可以省略其返回值。
- 函数在没有输入的情况下,直接表示为()。如 fun add()
函数的使用
需要通过调用函数来在函数主体内运行代码。如:
sum(3,5)
看个实例:
fun main(args: Array<String>) {
//调用求和函数
print(sum(4, 9))
}
//定义函数求和
fun sum(a: Int, b: Int): Int {
return a + b
}
结果:13
函数的作用范围
函数根据作用范围可有分为:成员函数、本地函数、顶层函数
成员函数
成员函数是指在类或对象中的内部函数。例如:声明一个类,在类中在定义一个方法,这个方法就是这个类的成员函数。
class Persion {
fun outPutName(){
print("Alfred")
}
}
outPut这个方法就是类Persion的成员函数。
成员函数的使用:先初始化对象,在根据对象使用中缀符号(.)
调用其成员函数
class Persion {
fun outPutName() {
val name = inptName() //调用inputName()方法
print("input name is $name")
}
fun inptName(): String {
//接受键盘输入
return readLine().toString()
}
}
class TestFun{
companion object {
@JvmStatic
fun main(args: Array<String>) {
//先实例化Persion类
val persion = Persion()
//先初始化对象,在根据对象使用`中缀符号(.)`调用其成员函数
persion.outPutName()
}
}
}
本地函数Local Function
本地函数又称嵌套函数,顾名思义,就是函数内部定义函数,注意一点必须在使用前声明Kotlin本地函数
。直接看下官方介绍:
In this simple code example...
fun testLocalFunctions() {
aLocalFun() //compiler error: unresolved reference at aLocalFun
fun aLocalFun() {}
aLocalFun() //no error
}
下面我们来改写下成员函数那个例子:
class Persion {
fun outPutName() {
//定义本地函数,接受键盘输入,切记函数定义必须在函数调用之前。
fun inptName(): String {
//接受键盘输入
return readLine().toString()
}
val name = inptName() //调用inputName()方法
print("input name is $name")
}
}
class TestFun{
companion object {
@JvmStatic
fun main(args: Array<String>) {
//先实例化Persion类
val persion = Persion()
//先初始化对象,在根据对象使用`中缀符号(.)`调用其成员函数
persion.outPutName()
}
}
}
顶层函数
除了本地函数和成员函数外,kotlin还支持顶层函数,所谓顶层函数,也就是函数不属于任何源码文件的小集团(class interface..)。而是直接定义在源码文件中的。
在 java 项目中,有很多的工具类,很多都是静态方法调用,而这个工具类,也是只当作一种容器,用来存放这些静态方法和静态属性。
Kotllin 认为,根本不需要创建这些无意义的类。可以直接将函数放在代码文件的顶层,不用附属于任何一个类,也就是将函数定义在kt文件中。
package com.alfred
fun sum(a: Int, b: Int): Int {
return a + b
}
fun mutiply(a: Int, b: Int): Int {
return a * b
}
注意:顶层函数,属于包内成员,包内可以直接使用,包外需要 import 包名.顶层函数
即可调用。
命名参数和默认参数
命名参数
就是在调用参数的时候将参数名称也写出来,这样参数众多时函数调用时会比较易于阅读。
fun main(args: Array<String>) {
getPersionInfo(name = "alfred",
age = 29,
sex = "男",
height = 180,
weight = 70)
}
fun getPersionInfo(name: String, age: Int, sex: String, height: Int, weight: Int) {
print(" 姓名:$name\n 性别:$sex\n 年龄:$age\n 身高:$height cm\n 体重:$weight kg")
}
默认参数
给函数的参数加上默认值,当函数调用没有传参数时,函数使用默认值。来看例子:
fun main(args: Array<String>) {
getPersionInfo(name = "alfred", age = 29, height = 180, weight = 70)
getPersionInfo(name = "张三", age = 40)
}
fun getPersionInfo(name: String, age: Int, sex: String = "男", height: Int = 180, weight: Int = 66) {
print(" 姓名:$name\n 性别:$sex\n 年龄:$age\n 身高:$height cm\n 体重:$weight kg\n")
}
结果:
姓名:alfred
性别:男
年龄:29
身高:180 cm
体重:70 kg
姓名:张三
性别:男
年龄:40
身高:180 cm
体重:66 kg
可以在声明函数的时候,指定参数默认值,这样就可以避免创建多个重载函数。
整体来说使用命名参数和默认参数的组合,可以大大增强代码灵活性和减少代码的冗余,具体怎么用还得自己熟悉和摸索。
可变个数参数(vararg)
可变个数形参:是指可接受零个或者多个指定类型值得形参,你可以用它来传递任意数量的输入参数。
声明可变个数形参需要用到vararg关键字,当参数传递进入函数体之后,参数在函数体内可以通过集合的形式访问。
函数最多可以有一个可变个数的形参,而且它必须出现在参数列表的最后。
sum(vararg num : I) : Int{
var result : Int = 0
for (item in num) {
result += item
}
return result
}
// 使用的时候,则可以传任意多个参数
sum(1, 2, 3, 4)