版权声明:本文为原博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_32115439/article/details/73692072
1、嵌套类(Nested Classes)
类可以嵌套在其他类中,不能访问外部类成员:
class Outer {
private val bar: Int = 1
class Nest {
//嵌套类不能访问外部类成员,相当于java的static静态内部类
fun foo() = 2
}
}
fun main(args: Array<String>) {
//创建嵌套类Nest对象,不需要外部类Outer对象
println(Outer.Nest().foo())
}
2、内部类(Inner Classes)
如果需要去访问外部类的成员,需要用inner修饰符来标注被嵌套的类。内部类会隐式持有对外部类的引用
使用inner来声明Nested类后,就相当于将之声明为非静态内部类,因此
类标记为inner,可以访问外部类成员:
class Outer {
private val bar: Int = 1
inner class Inner {
//内部类可以访问外部类成员,可看作外部类对象的一个成员
fun foo() = bar
}
}
fun main(args: Array<String>) {
//创建内部类Inner对象,需要外部类Outer对象
val outer = Outer()
println(outer.Inner().foo())
}
3、匿名内部类(Anonymous inner classes)
用对象表达式,创建匿名内部类的实例:
window.addMouseListener(
object:MouseAdapter(){
override fun mouseClicked(e: MouseEvent){
...
}
override fun mouseEntered(e MouseEvent){
}
}
)
当接口仅有一个接口方法/函数,可用lambda表达式省略接口方法/函数:
val listener = ActionListener{
println("clicked")//lambda表达式-简化的匿名内部类
}