this关键字的指向
kotlin中的this比java的this功能更加的强大,它支持带标签的写法,通过这种带标签this的写法可以进行非常细致的区分。
kotlin关于this的处理规则如下:
- 类的方法或属性中,this代表着调用该属性或方法的对象。
- 在类的构造器中,this代表着构造器即将返回的对象。
- 在扩展函数或者带接收者的函数字面值中,this表示(.)左边的接收者。
- 如果this没有限定符,那么它优先代表包含该this最内层的接收者,并且会自动向外搜索。如果要让this明确引用特定的接收者,可以使用标签限定符。
如下一段程序可以很直观的体现上面所描述的几种情况,也有助于我们对this的理解。
示例代码如下:
class A {
inner class B {
fun Int.foo() {
val a = this@A//A的this
val b = this@B //B的this
var c = this//不带标签的this,默认代表方法所属的对象:Int对象
var c1 = this@foo//显式指定@foo标签,与c代表的对象相同
println(a)
println(b)
println(c)
println(c1)
//为String类扩展funList方法
val funList = lambda@ fun String.() {
val d = this
val d1 = this@lambda //显示指定@lambda标签,与d代表的对象相同
println(d)
println(d1)
}
"fefef".funList()
//直接定义一个lambda表达式,没有接收者
val funList2 = {
//该this所在的Lambda没有接收者,因此当前范围没有this
//系统会继续在该lambda所在的范围搜索this
//故此处this将代表foo()方法的接收者:Int对象
val e = this
val e1 = this@foo//显示指定@foo标签,与e代表的对象相同
println("foo()方法中的lambda表达式的 this :" + e)
println("e1 的this:" + e1)
}
funList2()
}
fun testB() {
//调用2(Int 值)的foo()方法
2.foo()
}
}
fun testA() {
var bObj = B()
println("程序创建的B对象:${bObj}")
bObj.testB()
}
}
fun main(args: Array<String>) {
var aObj = A()
println("程序创建A对象:${aObj}")
aObj.testA()
}
打印结果为:
程序创建A对象:com.guojingbu.learning_kotlin.A@5cad8086
程序创建的B对象:com.guojingbu.learning_kotlin.A$B@6e0be858
com.guojingbu.learning_kotlin.A@5cad8086
com.guojingbu.learning_kotlin.A$B@6e0be858
2
2
fefef
fefef
foo()方法中的lambda表达式的 this :2
e1 的this:2