31. 内部类

作者: 厚土火焱 | 来源:发表于2017-11-25 02:31 被阅读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 了。

    相关文章

      网友评论

        本文标题:31. 内部类

        本文链接:https://www.haomeiwen.com/subject/fruqbxtx.html