//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() } }