与Java不同的是,Kotlin可以对一个类的属性和方法进行扩展。
1.扩展函数的定义格式
fun functionType.functionName(params){
函数体
}
functionType:要扩展函数的对象,表示函数的接收者
functionName:扩展函数的名称
params:扩展函数的参数
class Animation(var name: String)
/**
* 扩展函数:在已有类中添加新的方法,不会对原类做修改
*/
fun Animation.Print() {
println("用户名:${name}")
println("扩展函数")
}
fun main(args: Array<String>) {
var animation = Animation("Kotlin")
animation.Print()
}
用户名:Kotlin
扩展函数
2.伴生对象的扩展
如果一个类定义有一个伴生对象 ,你也可以为伴生对象定义扩展函数和属性。
伴生对象通过"类名."形式调用伴生对象,伴生对象声明的扩展函数,通过用类名限定符来调用:
class MyClass {
companion object {}
}
fun MyClass.Companion.foo() {
println("伴生对象的扩展函数")
}
val MyClass.Companion.no: Int //扩展属性
get() = 100
fun main(args: Array<String>) {
println("no:${MyClass.no}")
MyClass.foo()
}
no:100
伴生对象的扩展函数
这里有写到属性的扩展:
扩展属性 允许定义在Kotlin文件中,不允许定义在函数中,不允许初始化,只能显示定义getter 、setter方法,并且扩展属性只能被声明为val
3.在一个类的内部可以为另一个类声明扩展
***
* 在一个类的内部可以为另一个类声明扩展
* 在这个扩展中,有多个隐含的接受者,
* 其中扩展方法定义所在类的实例称为分发接收者
* 而扩展方法的目标类实例称为扩展接收者
*/
class P {
fun bar() {
println("P bar")
}
}
class O {
fun baz() {
println("O baz")
}
//在O类中创建P类的扩展函数,在这个扩展函数中,可以调用本类也就是O类的函数,也可以 调用被扩展类的函数即P类中的函数
fun P.foo() {
bar() //
baz()
}
fun caller(p: P) {
p.foo() //调用扩展函数
}
}
fun main(args: Array<String>) {
val p: P = P()
val o: O = O()
o.caller(p)
}
P bar
O baz