0Pricing
Kotlin Academy · 课时

嵌套类

类中的类

嵌套类 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

类中的类

Kotlin 允许您在一个类中声明另一个类。默认情况下,这样的类是嵌套类,不会持有对外部实例的引用。

class Outer {
    class Nested {
        fun hello() = "Hi from Nested"
    }
}

fun main() {
    println(Outer.Nested().hello())
}

创建嵌套实例

由于嵌套类是独立的,因此您无需外部实例,只需通过外部类名称创建它:Outer.Nested()。

class Computer {
    class Cpu {
        val cores = 8
    }
}

fun main() {
    val cpu = Computer.Cpu()
    println(cpu.cores)
}

无法访问外部成员

嵌套类没有外部引用,因此无法访问外部类的实例成员。它的行为类似于一个处于某个名称作用域下的顶层类。

class Bank {
    val name = "ACME"
    class Branch {
        fun describe() = "A branch"
    }
}

fun main() {
    println(Bank.Branch().describe())
}

为什么要嵌套

嵌套表达了逻辑分组:内部类型在概念上属于外部类型,从而改善组织结构和命名空间管理。

class Http {
    class Request(val url: String)
}

fun main() {
    val r = Http.Request("/home")
    println(r.url)
}

带属性的嵌套类

嵌套类就是普通的类:可以拥有构造函数、属性和方法。

class Garage {
    class Car(val model: String) {
        fun honk() = "$model: beep"
    }
}

fun main() {
    println(Garage.Car("Tesla").honk())
}

访问伴生对象或类似静态的成员

可以在任何位置使用外部类名引用嵌套类,其方式类似于 Java 中的静态嵌套类。

class Config {
    class Defaults {
        val timeout = 30
    }
}

fun main() {
    println(Config.Defaults().timeout)
}

多个嵌套类

外部类可以包含多个嵌套类,将相关类型组织在一起。

class Shapes {
    class Circle(val r: Int)
    class Square(val side: Int)
}

fun main() {
    println(Shapes.Circle(5).r)
    println(Shapes.Square(4).side)
}

嵌套在嵌套类中

您可以进行多层嵌套,不过嵌套层级过深可能会降低可读性。

class A {
    class B {
        class C {
            val value = 42
        }
    }
}

fun main() {
    println(A.B.C().value)
}

嵌套类与顶层类

从功能上看,嵌套类和顶层类类似;唯一的区别是限定名称不同。当这种关系有助于提高代码清晰度时,可以选择嵌套。

class Order {
    class Item(val price: Int)
}

fun main() {
    val total = Order.Item(10).price + Order.Item(5).price
    println(total)
}

一种实用的组织方式

将构建器的结果类型放在其所有者之下,读起来很自然。

class Parser {
    class Result(val ok: Boolean, val message: String)

    fun parse(text: String) = Result(text.isNotEmpty(), "parsed")
}

fun main() {
    val res = Parser().parse("data")
    println("${res.ok} ${res.message}")
}

需要记住的关键规则

让类持有外部引用的关键字是 inner。没有它,嵌套类就类似静态类,并且与外部类相互隔离。

class Box {
    class Lid
}

fun main() {
    println(Box.Lid() != null)
}

快速检查

请测试您对嵌套类的理解。

回顾

您了解了嵌套类:

  • 声明在另一个类内部,默认是 class(嵌套类)。
  • 不引用外部实例,因此无法访问外部成员。
  • 通过外部类名创建:Outer.Nested()。
  • 非常适合进行逻辑分组和命名空间管理。
class Outer {
    class Nested { val x = 1 }
}

fun main() {
    println(Outer.Nested().x)
}

常见问题解答

「嵌套类」课时是免费的吗?

是的 — 「嵌套类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「嵌套类」这节课中我会学到什么?

类中的类 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「嵌套类」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌套类
  2. 内部类
  3. 匿名对象
  4. 局部类
← 返回 Kotlin Academy