对于Kotlin中的函数来说,和JavaScript或者Lua这些语言很像,它有着这些语言的特性。但是也与这些语言就着许多不同之处。或许你更了解Java语言,然而对于Java语言来说,它不是不是闭包这个特性的。由于在这篇文章主要是讲解函数的基本使用,故而只会讲解到函数的定义、函数的返回值、函数的参数等。剩下的部分我会在这个系列的高级篇会给大家奉上。
目录 一、函数的声明及基本使用在Kotlin中函数的声明,同JavaScript相似。
1.1、函数的声明Kotlin中的函数声明关键字为:fun
定义格式为:可见性修饰符 fun 函数名(参数名 :类型,...) : 返回值{}
这里的可见性修饰符请参见我的另一篇文章Kotlin——可见性修饰符详解,至于返回值以及参数请继续往下面看
例:定义一个最基本的函数
fun basis(){ ... }注意:
上面的例子中没有可见性修饰符,那是因为Kotlin中默认为public可见性修饰符
()圆括号必须存在,即使是没有参数的情况下
{}大括号必须存在,即使是没有函数体的时候,不过在Kotlin中有一个特例就是,函数具备返回值的时候,如果只用一个表达式就可以完成这个函数,则可以使用单表达式函数。在下面会详细的给大家讲解
在函数没有返回值时可以省略其返回值
1.2、成员函数成员函数是指在类或对象中的内部函数。你可以参见我的另一篇文章Kotlin——类详解
例:声明一个类,在类中在定义一个方法,这个方法就是这个类的成员函数
class Test{ fun foo(){} } 1.3、函数的使用函数的使用分为两种:
普通的使用
成员函数的使用
例:
// 普通的使用 basis() // 如果函数有返回值 val x = basis() // 成员函数的使用:先初始化对象,在根据对象使用`中缀符号(.)`调用其成员函数 Test().foo() // 如果函数有返回值 val x = Test().foo() 二、函数的返回值在Kotlin中,函数的返回值类型可以分为:
Unit类型:该类型即无返回值的情况,可以省略。
其他类型: 显示返回类型的情况
2.1、Unit类型这个类型可以理解为函数无返回值。
例:
fun unitFun() : Unit{ println("我是返回值为Unit的函数,Unit可省略") return // return Unit 可省略 // 或者 return 可省略 } 等价于 fun unitFun(){ println("我是返回值为Unit的函数,Unit可省略") }当无返回值时,使用平时Java语法写普通函数一样即可。不需显示写成Unit。这里只是做一个介绍而已
2.2 、其他显示返回类型的返回值这个类型可以理解为,该函数具有返回值,并且返回值类型不能省略,并且return也不能省略
例: 定义一个返回类型为Int的函数
fun returnFun() : Int{ return 2 } 三、函数的参数对于函数中的参数来说,这里主要分为几个模块来讲解:
具有参数的基本函数声明
默认参数,即参数具有默认值
命名参数,当传递参数的时候显示使用参数名 = 参数值
可变数量的参数:即参数的个数不定。
3.1、具有参数的函数定义定义一个具有参数的函数,使用Pascal表示法定义,即为:name : type。其中的参数必须具有显示的参数类型,并且参数与参数之间用逗号(,)隔开。
例:
fun funArgs(numA : Int, numB : Float){ println("numA = $numA \t numB = $numB") } fun main(args: Array<String>) { funArgs(1,10f) } 3.2、默认参数对于默认参数,即使指一个函数中的参数具有默认值,这样在使用该函数的时候,可以省略一部分参数,可以减少函数的重载
例:定义个具有默认参数的函数
fun defArgs(numA : Int = 1, numB : Float = 2f, numC : Boolean = false){ println("numA = $numA \t numB = $numB \t numC = $numC") } fun main(args: Array<String>) { // 默认参数的函数使用 defArgs() defArgs(1,10f,true) }输出结果为:
numA = 1 numB = 2.0 numC = false numA = 1 numB = 10.0 numC = true可以看出:当具有默认参数时,可以对是参数有默认值的参数不传递参数值。
不过这里有一点值得注意的是: 当该函数是一个成员函数时,并且该函数时覆写继承类中的方法时,则该成员函数必须从签名中省略该函数的默认值。其实这一点不必过于看重,因为在你覆写方法时,编辑器都默认会帮你实现的..
举例说明:
open class A{ open fun foo(i : Int = 10){} } class B : A(){ override fun foo(i: Int) { super.foo(i) println(i) } } fun main(args: Array<String>) { B().foo() }输出结果为:10
如果你对类继承不了解,可以参见我的另一篇文章
3.3、命名参数即在使用函数时显示使用参数名 = 参数值这种方式传递参数