函数声明:
例子:声明一个函数
fun double(a: Int): Int {
return 2 * a
}
传统方法调用函数:
fun main() {
val result = double(3)
print(result)
}
调用成员函数:
fun main() {
val result = double(3)
print(result)
// 成员函数使用点表示方法调用
PersonTwo().printName()
}
fun double(a: Int): Int {
return 2 * a
}
class PersonTwo() {
fun printName() {
print("小黄")
}
}
- 注意:成员函数调用通过点表示法
函数参数:
- 具名参数
- 默认参数
fun main() {
// 普通传递参数 需要按照参数顺序传递
addAc(2, 3)
// 具名参数 无需按照顺序传递
addAc(b = 2, a = 6)
// 默认参数 也就是函数参数可以指定默认值 如果调用函数时该参数不传 那么就会使用默认值
// 换句话说,默认参数可以不传,可以减少重载的
addAc(2, 2)// 不传,就取默认参数
addAc(2, 2, 4)
}
fun addAc(a: Int, b: Int, c: Int = 0): Boolean {
val value = a + b
var bo = false
if (value > 5) {
println("超过五位童鞋考零分")
bo = true
} else {
println("班级整体成绩还可以")
bo = false
}
return bo
}
- 注意点:重写一个带有默认参数的函数,必须在重写的函数中省略默认参数值
例如:
open class ClassA() {
open fun test(def: Int = 0) {
}
}
class ClassB : ClassA() {
//override fun test(def: Int = 3) {}// An overriding function is not allowed to specify default values for its parameters
// 正确的写法 是去掉重写的默认参数的值
override fun test(def: Int) {}
}
- 形参 实参 例如:函数addAc(b = 2, a = 6) 形参就是 a 实参就是 2
- 默认参数:函数参数可以有默认值,当调用函数省略相应的参数时使用默认值,好处就是,减少重载数量
- 具名参数:如果有多个参数,使用具名的方式 那么参数的传递可以不用按照顺序传 例如:addAc(b = 2, a = 6)
- 如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用具名参数调用
例如:
fun main() {
// 报错
//test(3)// None of the following functions can be called with the arguments supplied.
test(3,4)
// 或
test(b = 4)
// 或
test(b = 3, a = 4)
}
fun test(a:Int = 4, b:Int) {
}
- 如果在默认参数之后的最后一个参数是lambda表达式,那么它既可以作为具名参数在括号内传入,也可以再括号外传入
- 调用Java函数时不能使用具名参数语法,因为Java字节码并不总是保留函数参数的名称
返回Unit的函数:
如果一个函数不返回任何有用的值,它的返回类型是Unit 可以是显示也可以隐式
fun cancel1() {}
fun cancel2():Unit {}
单表达式函数:
如果函数的函数体只有一行代码 就可以使用简洁方式 例如:
fun ackOk1():Int {
return 2;
}
fun ackOk2():Int = 2
fun ackOk3() = 2
- 函数返回单个表达式时,可以省略花括号 用 = 号连接
- 当返回值类型可以由编译器推断时,显示声明返回类型是可选的,也就是返回值类型可以省略
- 具有块代码体的函数 返回值类型是不可以省略 必须要写的 除非它们旨在返回Unit
可变数量参数
函数的参数通常可以使用vararg修饰符进行标记 通常也是最后一个参数
fun main() {
scoreT("小黄", 66, 77, 88)
}
fun scoreT(name: String, vararg score: Int) {
var sum = 0
score.forEach {
sum += it
}
println("$name 的总成绩:$sum")
}
执行结果:小黄 的总成绩:231
- 如果可变参数在其它非可变参数的前面 那么其它非可变参数必须使用具名方式调用 参数必须按照顺序传递
例如:
fun main() {
scoreV(22, 33, 44, name = "小李子")
}
fun scoreV(vararg score: Int, name: String) {
var sum = 0
score.forEach {
sum += it
}
println("$name 的总成绩:$sum")
}
中缀表示法
标有infix关键字的函数 也可以使用中缀表示法(忽略该调用的点与圆括号)
中缀函数必须满足以下几个条件:
- 它们必须是成员函数或者扩展函数
- 它们必须只有一个参数
- 其参数不得接收可变数量的参数且不能有默认值
例如:
fun main() {
val result = 1.shl(1)
val result1 = 1 shl 1
val result2 = 2 shl 1
println(result)
println(result1)
println(result2)
}
// 整数值的二倍
infix fun Int.shl(x: Int) = x * 2 // ⽤中缀表⽰法调⽤该函数 1 shl 2 // 等同于这样 1.shl(2)
执行结果:
2
2
4
网友评论