在 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) 已經(jīng)識別為外部類的屬性 a 了。