美文网首页
17.嵌套类与内部类深入详解

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

作者: leofight | 来源:发表于2018-03-11 17:11 被阅读0次

嵌套类(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关键字修饰的内部类。**

相关文章

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

    嵌套类(Nested Class) 类可以嵌套在其他类中:示例代码1. 输出 示例代码2: 输出 内部类(Inne...

  • Kotlin内联类、内部类、嵌套类

    Kotlin内联类、内部类、嵌套类 在开始介绍Kotlin内联类、内部类、嵌套类之前,先简要回顾一下java中的内...

  • 《Kotlin 实战》- 4 类、对象和接口

    4.1.4 内部类和嵌套类:默认是嵌套类 默认情况下 Kotlin 的嵌套类不能访问外部类的实例(不持有外部类的引...

  • 常见的类

    嵌套类 内部类 枚举类 密封类 数据类 单例模式 伴生对象 嵌套类 嵌套类是嵌套在其它类中的类 不能访问外部类的成...

  • Java 内部类(嵌套类)和局部类

    嵌套类 定义在另一个类中的类,就叫嵌套类。在嵌套类外层的累,称为:外部类最外层的外部类,称为:顶级类 嵌套类又分为...

  • Java-嵌套类

    嵌套类分为两类:静态和非静态。被声明static的嵌套类称为静态嵌套类。非静态嵌套类称为内部类。内部类有两种特殊的...

  • java-内部类的创建

    java 创建内部类时离不开他的外围类,除非内部类是嵌套类(即静态内部类),嵌套类中的内部类也是如此 比如: pu...

  • 内部类、枚举类

    内部类 在类中也可以定义类,默认是public,成为嵌套类 嵌套类用关键字inner标记,称为内部类。 内部类可以...

  • 特殊类

    嵌套类class A{class B{}}//使用嵌套类时,只能引用外部类的类名,不能调用外部类的构造函数val ...

  • C# 嵌套类

    在一个类或类的方法中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。嵌套类是外部类的补充,通过...

网友评论

      本文标题:17.嵌套类与内部类深入详解

      本文链接:https://www.haomeiwen.com/subject/yhtvxftx.html