7.2 Kotlin嵌套和内部类

把类定义在其他类里面,定义在内部的类即为嵌套类,包含嵌套类的类称为外部类。定义的方式不一样,又分为嵌套类、内部类。此时的内部类、嵌套类相当于外部类成员,也可以使用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()
}

结果:

内部类方法
外部类属性
外部类方法

外部类-内部类交互原理

为什么内部类可以调用外部类私有成员?
​ 在内部类对象中,保存了一个该内部类所寄生的外部类的对象的引用。内部类在方法中访问属性顺序:方法是否有该变量(如果没有,下同)=》内部类是否有该属性=》外部类是否有该属性,如果都没有,则编译报错。

为什么外部类不能直接调用内部类成员?
​ 创建外部类对象时,内部类根本还不存在(如果没有在外部类创建该内部类对象)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容