17.嵌套类与内部类深入详解

2018-03-11  本文已影响0人  leofight

嵌套类(Nested Class)

类可以嵌套在其他类中:
示例代码1.

package com.leofight.kotlin3

class OuterClass {

    private val str: String = "hello world"

    class NestedClass {
        fun nestedMethod() = "welcome"
    }
}

fun main(args: Array<String>) {
    println(OuterClass.NestedClass().nestedMethod())
}

输出

welcome

示例代码2:

package com.leofight.kotlin3

class OuterClass4 {
    class NestedClass4 {
        init {
            println("NestedClass4构造块执行")
        }
    }
}

fun main(args: Array<String>) {
    val nestedClass4: OuterClass4.NestedClass4 = OuterClass4.NestedClass4();
}

输出

NestedClass4构造块执行

内部类(Inner Class)

类可以标记为 inner 以便能够访问外部类的成员。内部类会带有一个对外部类的对象的引用:

示例代码1

package com.leofight.kotlin3

class OuterClass2 {

    private var str: String = "hello world"

    inner class InnerClass {
        fun innerMethod() = this@OuterClass2.str
    }

    //局部嵌套类
    fun getName(): String {
        class LocalNestedClass {
            val name: String = "mytest"
        }

        val localNestedClass = LocalNestedClass()
        return localNestedClass.name
    }
}

fun main(args: Array<String>) {
    println(OuterClass2().InnerClass().innerMethod())

    println(OuterClass2().getName())
}

输出

hello world
mytest

示例代码2

package com.leofight.kotlin3

class Person(val name: String, var age: Int) {

    private val str: String = "Person属性"

    private inner class PersonFeature(var height: Int, var weight: Int) {
        private val str: String = "PersonFeature属性"
        fun getPersonFeature() {
            val str: String = "局部变量"
            println("身高:$height,体重:$weight")

            println("${this@Person.str}")
            println("${this.str}")
            println(str)

            this@Person.method()
        }
    }

    private fun method() {
        println("执行了Person的method方法")
    }

    fun getPerson() {
        val personFeature = PersonFeature(120, 180)
        personFeature.getPersonFeature()
    }
}

fun main(args: Array<String>) {
    val person = Person("张三", 20)
    person.getPerson()
}

输出

身高:120,体重:180
Person属性
PersonFeature属性
局部变量
执行了Person的method方法

Kotlin访问外部类变量的方式:this@OuterClass.str
Java访问外部类变量的方式:OuterClass.this.str

示例代码3

package com.leofight.kotlin3

class OuterClass5 {
    inner class InnerClass5(str: String) {
        init {
            println(str)
        }
    }
}

fun main(args: Array<String>) {
    val innerClass5: OuterClass5.InnerClass5 = OuterClass5().InnerClass5("hello world");
}

输出

hello world

关于嵌套类与内部类之间的区别与联系

1.嵌套类:对应于Java的静态内部类(即有static关键字修饰的内部类),只要在一个类的内部定义了另外一个类,那么这个类就叫做嵌套类,相当于Java当中有static关键字修饰的内部类。**
2.内部类:对应于Java中的非静态内部类(即没有static关键字修复的内部类),使用inner关键字在一个类的内部所定义的另外一个类叫做内部类,相当于Java当中没有static关键字修饰的内部类。**

上一篇 下一篇

猜你喜欢

热点阅读