Kotlin学习笔记(11)- 内部类和嵌套类

系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
Kotlin学习笔记(1)- 环境配置
Kotlin学习笔记(2)- 空安全
Kotlin学习笔记(3)- 语法
Kotlin学习笔记(4)- 流程控制
Kotlin学习笔记(5)- 类
Kotlin学习笔记(6)- 属性
Kotlin学习笔记(7)- 接口
Kotlin学习笔记(8)- 扩展
Kotlin学习笔记(8)- 扩展(续)
Kotlin学习笔记(9)- 数据类
Kotlin学习笔记(10)- 泛型
Kotlin学习笔记(11)- 内部类和嵌套类
Kotlin学习笔记(12)- 委托
Kotlin学习笔记(13)- 函数式编程
Kotlin学习笔记(14)- lambda

一、嵌套类

嵌套类顾名思义,就是嵌套在其他类中的类。而嵌套类外部的类一般被称为包装类或者外部类。

class Outter{
    class Nested{
        fun execute(){
            Log.d("test", "Nested -> execute")
        }
    }
}

// 调用
Outter.Nested().execute()

//输出
Nested -> execute

二、内部类

内部类和嵌套类有些类似,不同点是内部类用关键字inner修饰。

class Outter{
    val testVal = "test"
    inner class Inner{
        fun execute(){
            Log.d("test", "Inner -> execute : can read testVal=$testVal")
        }
    }
}

// 调用
val outter = Outter()
outter.Inner().execute()

// 输出
Inner -> execute : can read testVal=test

两小段代码看完,对内部类和嵌套类都有了点了解,东西不多,也不难。那么我们来对比看一下他们在使用中有什么不同,当然这只是我总结的很浅的不同点,毕竟我也是刚学 : )

  1. 嵌套类可以直接创建实例,方式是包装类.嵌套类

    val nested : Outter.Nested()
    
  2. 内部类不能直接创建实例,需要通过外部类调用

    val outter = Outter()
    outter.Inner().execute()
    
  3. 嵌套类不能引用包装类的成员;内部类会带有一个对外部包装类的对象的引用,可以访问外部类中的成员属性和成员函数。

三、匿名内部类

使用对象表达式创建匿名内部类实例

text.setOnClickListener(object : View.OnClickListener{
    override fun onClick(p0: View?) {
        Log.d("test", p0.string())
    }
})

完整的写法应该是这样,但是通常我们用的是简捷的写法

text.setOnClickListener {
    Log.d("test", it.string())
}

当然还有更简洁的写法,那就要用到lambda了。请看我后面的文章《Kotlin学习笔记(14)- lambda》。

关于object的用法,可以看下刘大V的一篇文章:区别Kotlin中的object和companion object关键字

推荐阅读更多精彩内容