kotlin函数学习,应用笔记(基础篇)

kotlin函数类比java中的方法;

kotlin函数学习,应用笔记(基础篇)

函数访问层级:

一、顶层函数;

顶层函数访问域为全局,类似java中的全局方法,不需要具*定类,直接声明函数并实现即可在全局任意位置调用;

示例:

定义:

package com.example.modulethree.util


/** Int转Double*/
fun double(i:Int) : Double{
    var i_double = i.toDouble()
    return i_double
}
调用:
package com.example.modulethree.binder

import com.example.modulethree.delegate.KotlinMVPTestActivityDelegate
import com.example.modulethree.util.double
import com.example.mvp.binder.BaseDataBinder

class KotlinTestLayoutBinder : BaseDataBinder<KotlinMVPTestActivityDelegate,String>{

    override fun viewBindModel(viewDelegate: KotlinMVPTestActivityDelegate?, data: String?) {
        viewDelegate?.setText1(data)

        var index = double(10)
    }

    override fun getDataClass(): Class<String> {
        return String::class.java
    }

}
package com.example.modulethree.binder

import com.example.modulethree.delegate.KotlinTestFragmentDelegate
import com.example.modulethree.util.double
import com.example.mvp.binder.BaseDataBinder

class KotlinTestFragmentBinder : BaseDataBinder<KotlinTestFragmentDelegate,String>{
    override fun viewBindModel(viewDelegate: KotlinTestFragmentDelegate?, data: String?) {

        var index2 = double(7)

    }

    override fun getDataClass(): Class<String> {
        return String::class.java
    }
}

可以在项目中任意代码位置调用此方法,直接通过函数名访问,但是仅限当前module内;

扩展函数:

扩展某个类型的函数,增加对应的函数方法;

示例:

/** Int转Double*/
fun double(i:Int) : Double{
    var i_double = i.toDouble()
    return i_double
}

/** 扩展函数,扩展Double类型新增函数,Double类型均可调用此函数*/
fun Double.toString1() : String{
    var obj = this
    if(obj > 5){
        return "100"
    }
    return obj.toString()
}
调用(所有Double类型的数据对象均可调用此方法,具体使用场景应依据实际情况而定):

var index = double(10)
Log.e("indexStr:",index.toString1())
输出结果:

07-03 10:43:26.475 23239-23239/com.example.pc.routingtestproject E/indexStr:: 100

二、类构造函数(个人理解为java中的类构造函数);

*在Kotlin中,允许有一个主构造函数和多个二级构造函数(辅助构造函数)。其中主构造函数是类头的一部分。

*关键字或者构造函数名:constructor(参数)

1、主构造函数:

package com.example.modulethree.util.function

import android.util.Log

/**
 * Created by sun.li on 2018/7/3.
 * @author sun.li
 */
class FunTest constructor(index : Int){
    init {
        if(index > 50){
            Log.e("FunTest:","index大于50")
        }else{
            Log.e("FunTest:","index小于等于50")
        }
    }
}

等同于(因为是默认的可见性修饰符且不存在任何的注释符,所以主构造函数constructor关键字可以省略):

class FunTest(index : Int){
    init {
        if(index > 50){
            Log.e("FunTest:","index大于50")
        }else{
            Log.e("FunTest:","index小于等于50")
        }
    }
}

说明:

*构造函数中不能出现其他的代码,只能包含初始化代码,包含在初始化代码块中;

*关键字:init{...};

*注意点,init{...}中能使用构造函数中的参数;

什么时候什么场景可以省略constructor?

*在构造函数不具有注释符或默认可见性修饰符时,constructor关键字可以省略;

*默认的可见修饰符为public时,可以省略不写;

使用示例:

FunTest(50)
FunTest(55)

结果:

07-03 11:09:07.909 24040-24040/com.example.pc.routingtestproject E/FunTest:: index小于等于50

07-03 11:09:07.909 24040-24040/com.example.pc.routingtestproject E/FunTest:: index大于50

2、辅助(二级)构造函数:

*kotlin支持二级构造函数,它们已constructor关键字作为前缀;

示例:

package com.example.modulethree.util.function

import android.util.Log

/**
 * Created by sun.li on 2018/7/3.
 * @author sun.li
 */
class FunTest constructor(index : Int=49){
    init {
        if(index > 50){
            Log.e("FunTest:","index大于50")
        }else{
            Log.e("FunTest:",index.toString())
        }
    }

    constructor(index: Int,num : Int) : this(index){
        Log.e("FunTest:","index=$index \t num=$num")
    }
}

使用示例:

FunTest()
FunTest(50)
FunTest(55)
FunTest(100,33)

结果:

07-03 11:45:00.713 25097-25097/com.example.pc.routingtestproject E/FunTest:: 50
07-03 11:45:00.713 25097-25097/com.example.pc.routingtestproject E/FunTest:: index大于50
07-03 11:45:00.713 25097-25097/com.example.pc.routingtestproject E/FunTest:: index大于50

07-0311:45:00.713 25097-25097/com.example.pc.routingtestproject E/FunTest:: index=100      num=33

说明:

*二级构造函数中的参数index是委托了主构造函数的参数index;

*主构造函数参数设置默认值时,编译器会生成一个额外的无参构造函数,无参构造函数调用时会执行之构造函数的逻辑,index为默认值;

*当传入1个参数时只会执行主函数init代码块中的代码;

*当传入2个参数时不但会执行init代码块中的代码,还会执行二级构造函数中的代码;

*函数的入参均可以设置相应的默认值;

三、类成员函数

1、成员函数:

package com.example.modulethree.util.function

import android.util.Log

/**
 * Created by sun.li on 2018/7/3.
 * @author sun.li
 */
class ClassFunTest{

    fun foo() : Int{
        return 22
    }

    fun foo1(){
        Log.e("Foo:",foo().toString())
    }
}

调用:

var foo = ClassFunTest().foo()
ClassFunTest().foo1()

结果:

07-03 12:10:28.505 26480-26480/com.example.pc.routingtestproject E/Foo:: 22

函数内函数的使用示例:

fun foo2(){
    fun foo3(){
        Log.e("foo3:",foo().toString())
    }

    foo3()
}

调用示例:

ClassFunTest().foo2()
结果

07-03 12:12:23.507 26480-26480/com.example.pc.routingtestproject E/Foo3:: 22

函数的基本使用先整理到这里,下一篇整理函数学习进阶;