把类定义在其他类里面,定义在内部的类即为嵌套类,包含嵌套类的类称为外部类。定义的方式不一样,又分为嵌套类、内部类。此时的内部类、嵌套类相当于外部类成员,也可以使用public、internal、protected、private来修饰。
嵌套类
嵌套类的定义
当一个类在另一个类中声明时,它被称为嵌套类。嵌套类相当于java的静态内部类(static class)。但是kotlin完全取消了static关键字,所以kotlin类中除去嵌套类,其余成员均为非静态成员。
class OuterClass {
....
class NestedClass {
...
}
}
嵌套类的使用
外部类不能直接访问嵌套类的,属性跟方法,需创建嵌套类对象,通过对象调用嵌套类成员。
例:
class OuterClass {
val outerParam: String = "外部类属性"
fun outerFun1() {
println("执行外部类方法 outerFun1")
//外部类不能直接访问嵌套类的,属性跟方法
//println(nestedParam) //错误
//nestedFun1() //错误
//需创建嵌套类对象,通过对象调用嵌套类成员。
val nestedClass: NestedClass = NestedClass()
println(nestedClass.nestedParam)
nestedClass.nestedFun1()
}
//定义一个嵌套类
class NestedClass {
val nestedParam = "嵌套类属性"
fun nestedFun1() {
println("执行内部类方法 nestedFun1")
}
}
}
fun main(args: Array<String>) {
OuterClass().outerFun1()
}
结果:
执行外部类方法 outerFun1
嵌套类属性
执行内部类方法 nestedFun1
嵌套类不能直接访问外部类的成员,可以创建外部类对象,通过外部类对象获取外部类成员。
//定义一个外部类OuterClass
class OuterClass {
val outerParam: String = "外部类属性"
fun outerFun1() {
println("执行外部类方法 outerFun1")
}
//定义一个嵌套类
class NestedClass {
val nestedParam = "嵌套类属性"
fun nestedFun1() {
println("执行内部类方法 nestedFun1")
//嵌套类不能直接访问外部类的成员
//println(outerParam)
//outerFun1()
//可以创建外部类对象,通过外部类对象获取外部类成员。
val outerClass = OuterClass()
println(outerClass.outerParam)
outerClass.outerFun1()
}
}
}
fun main(args: Array<String>) {
//在外部类外部使用嵌套类
OuterClass.NestedClass().nestedFun1()
}
结果:
执行内部类方法 nestedFun1
外部类属性
执行外部类方法 outerFun1
内部类
内部类定义
使用inner修饰符声明 Kotlin 内部类。
class OuterClass {
...
inner class innerClass(){
...
}
}
内部类使用
内部类可以访问外部类的成员。
class OuterClass {
val outerParam = "外部类属性"
fun outerFun(){
println("外部类方法")
}
inner class innerClass(){
fun innerFun(){
println("内部类方法")
//内部类可以直接获取外部类的属性和方法
println(outerParam)
outerFun()
}
}
}
fun main(args: Array<String>) {
//外部类的外部调用内部类的方法
OuterClass().innerClass().innerFun()
}
结果:
内部类方法
外部类属性
外部类方法
外部类-内部类交互原理
为什么内部类可以调用外部类私有成员?
在内部类对象中,保存了一个该内部类所寄生的外部类的对象的引用。内部类在方法中访问属性顺序:方法是否有该变量(如果没有,下同)=》内部类是否有该属性=》外部类是否有该属性,如果都没有,则编译报错。
为什么外部类不能直接调用内部类成员?
创建外部类对象时,内部类根本还不存在(如果没有在外部类创建该内部类对象)。