kotlin

31. 内部类

2017-11-25  本文已影响33人  厚土火焱

在 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 了。

上一篇 下一篇

猜你喜欢

热点阅读