参考目录
隐藏
阅读完需:约 2 分钟
内部类
在kotlin中类内部的class前面不写修饰符默认就是静态内部类,class前面写 inner修饰符才是java中的普通内部类,与java一样,普通内部类会持有外部类的对象引用。


class Outer {
//普通内部类 与java一样会持有外部类的引用
inner class Inner
//默认静态内部类
class StaticInner
}
fun main() {
val inner = Outer().Inner()
val staticInner = Outer.StaticInner()
}
object类
object类内部的object类默认是静态的 不存在非静态的情况 不能定义成inner

object OuterObject {
//内部object默认是静态的 不存在非静态的情况 不能定义成inner
object StaticInnerObject
}
匿名内部类:

其实就是object 省略类名直接实现接口。
fun main() {
//匿名内部类
object : Cloneable {
}
}
匿名内部类 可用继承多个接口,java不行:

fun main() {
// 类型是混合类型:Cloneable & Runnable
val runnableCloneable = object : Cloneable, Runnable {
override fun run() {
}
}
}
实现多个接口时,它的类型是多个接口类型的混合类型。
但是java可以用本地类来变相的实现kotlin的实现多个接口

fun main() {
//本地函数
fun localFunc(){
println("Hello")
}
//对应Java的local class
class LocalClass: Cloneable, Runnable{
override fun run() {}
}
}
java,其实就是在静态函数的内部定义一个类:
public class JavaInnerClasses {
public static void main(String... args) {
class LocalClass implements Cloneable, Runnable {
@Override
public void run() { }
}
}
}

这个算是kotlin独有的了,因为java压根就没有顶级函数这个东西,就更别说函数套函数了。