//kotlin的類,甚至都不須要花括號 class User(var name:String) /** * 擴展函數(Extension Function) * 在類中添加新的方法,不對原類進行修改,擴展函數形式定義: * fun receiverType.functionName(params){ * body * } * 擴展是一種靜態行爲,對被擴展的類代碼自己不會形成任何影響。 * * receiverType:表示函數的接收者,也就是函數擴展的對象 functionName:擴展函數的名稱 params:擴展函數的參數,能夠爲NULL */ fun User.print(){ println("hello,your name is :$name") } fun main(args:Array<String>){ val user = User("Lee") user.print() val l = mutableListOf(1,2,3) l.swap(0,2) println(l.toString()) } fun MutableList<Int>.swap(index1:Int,index2:Int){ //this關鍵字指代接收者對象 val tmp = this[index1] this[index1] = this[index2] this[index2] = tmp }
open class C class D:C() fun C.foo()="c" fun D.foo()="D" fun printFoo(c:C){ println(c.foo()) } fun main(args:Array<String>){ /** * 擴展函數是靜態解析的,並非接收者類型的虛擬成員 * 在調用擴展函數時,具體被調用的是哪個函數,由調用 * 函數的對象表達式來決定的,而不是動態的類型決定的 */ val d = D() printFoo(d) var t = null println(t.toString()) } /** * 擴展一個空對象 * 在擴展函數內,能夠經過this來判斷接收者是否 * 爲null,這樣即便接收者爲null也能夠調用擴展函數 * */ fun Any?.toString():String{ if (this == null){ return "NULL" }else{ return toString() } } /** * 擴展屬性 * 除了函數,kotlin也支持屬性對屬性進行擴展 */
- 擴展聲明爲成員函數
fun main(args:Array<String>){ val c = C() val d = D() c.caller(d) } class D{ fun bar(){ println("D bar") } } class C{ fun baz(){ println("C baz") } /** * 在C類內,建立了D類的擴展,此時,C被成爲分發接收者, * 而D爲擴展接收者, */ fun D.foo(){ bar() baz() } fun caller(d: D){ d.foo() } }