嵌套类和内部类在java中于Kotlin中的对应关系
类A在另一个类B中声明 | 在Java中 | 在Kotlin中 |
---|---|---|
嵌套类(不存储外部类的引用) | static class A | class A |
内部类(存储外不类的引用) | class A | inner class A |
例子:
class Test {
var v = "成员属性"
/**
* 嵌套类
*/
class Nested {
fun nestedTest() {
println("嵌套类中的方法")
}
}
/**
* 内部类,持有外部类的引用
*/
inner class Inner {
fun innerTest() {
println("内部类中的方法")
//调用外部类
val test = this@Test
}
}
fun setInterFace(test: TestInterFace) {
test.test()
}
/**
* 接口
*/
interface TestInterFace {
fun test()
}
}
调用:
//调用嵌套类
Test.Nested().nestedTest()
//调用内部类
Test().Inner().innerTest()
//接口对象
Test().setInterFace(object : Test.TestInterFace {
override fun test() {
println("匿名内部类的实现")
}
})
-
类中可以嵌套类,创建嵌套类对象方式 : 外部类名.嵌套类(),嵌套类引用不了外部类的成员,这和Java类似,相当于隐式的外部类。
-
用inner标记的嵌套类是内部类,创建内部类的对象的方式 : 外部类名().Inner()。可以引用外部类的成员,引用外部类的this对象的方式 : var v=this@外部类名
-
通过对象表达式来 创建匿名内部类的对象,可以避免重写抽象类的子类和接口的实现类,这和Java中匿名内部类的是接口和抽象类的延伸一致。