在 kotlin 内,一个类中可以再嵌套类。在内部的这个类中,如果要调用外部的类中的变量则需要使用外部类的对象。当然,也可以使用this@来引导
class Big{
val a: Int = 0
fun jj(){
Small().Hello()
}
class Small{
val b:Int = 1
fun Hello(){
println(Big().a)
println(b)
println(this@Small.b)
}
}
inner class Little{
val a:Int = 2
fun Hello(){
println(Big().a)
println(a)
println(this@Big.a)
println(this@Little.a)
}
}
}
通过这个类 Big,内部包含了两个类,一个是普通类,一个是 inner 类。
当内部类调用外部类的属性时,使用类对象是安全的。
如果内部类和外部类有相同名称的属性,内部类的调用不使用外部类的对象时,代码可读性会变差。
注意 inner class Little,如果内部没有 val a:Int = 2 这行代码,println(a) 的输出结果会完全不同。
调用代码示例
fun main(args: Array<String>) {
val big = Big()
big.jj()
println("--------------")
big.Little().Hello()
println("==============")
Big().jj()
println("~~~~~~~~~~~~~~")
Big().Little().Hello()
}
当前运行的结果是
0
1
1
--------------
0
2
0
2
==============
0
1
1
~~~~~~~~~~~~~~
0
2
0
2
当我们注释掉 inner class Little 有关内部类的 a 属性相关的语句后,
inner class Little{
// val a:Int = 2
fun Hello(){
println(Big().a)
println(a)
println(this@Big.a)
// println(this@Little.a)
}
}
再运行代码,结果就是
0
1
1
--------------
0
0
0
==============
0
1
1
~~~~~~~~~~~~~~
0
0
0
显然 inner class Little 内的 println(a) 已经识别为外部类的属性 a 了。
网友评论