美文网首页Kotlin
函数声明及其用法

函数声明及其用法

作者: 码农修行之路 | 来源:发表于2020-11-17 23:19 被阅读0次

    函数声明:

    例子:声明一个函数

    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关键字的函数 也可以使用中缀表示法(忽略该调用的点与圆括号)
    中缀函数必须满足以下几个条件:

    1. 它们必须是成员函数或者扩展函数
    2. 它们必须只有一个参数
    3. 其参数不得接收可变数量的参数且不能有默认值
      例如:
    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

    相关文章

      网友评论

        本文标题:函数声明及其用法

        本文链接:https://www.haomeiwen.com/subject/lustiktx.html