0Pricing
Android Academy · 课时

构造函数与 init

创建并初始化对象。

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

什么是构造函数

构造函数是在创建对象时运行的特殊代码,用于设置对象的初始值。

在 Kotlin 中,主构造函数直接写在类名旁边。

主构造函数

主构造函数写在类名后面的括号中。创建对象时,您需要传入相应的值。

这里的Dog在创建时要求提供名称。

class Dog(name: String) {
    val dogName = name
}

fun main() {
    val d = Dog("Rex")
    println(d.dogName)
}

构造函数中的属性

在构造函数参数前添加val或var,就会自动将该参数转换为属性。

这是 Kotlin 中最常见且简洁的写法。

class Dog(val name: String, var age: Int)

fun main() {
    val d = Dog("Rex", 3)
    println(d.name + " is " + d.age)
}

构造函数的默认值

构造函数参数也可以设置默认值。这样,调用者就可以省略这些参数。

如果未提供age,它的默认值就是0。

class Dog(val name: String, var age: Int = 0)

fun main() {
    val d = Dog("Max")
    println(d.age)
}

init 代码块

init代码块会作为主构造函数的一部分运行。对于无法在一行属性声明中完成的初始化逻辑,可以使用它。

它可以读取构造函数参数。

class Dog(val name: String) {
    init {
        println("Created dog: " + name)
    }
}

fun main() {
    Dog("Rex")
}

在 init 中进行验证

init的常见用途是检查输入。这里使用require防止年龄为负数。

如果检查失败,就不会创建对象。

class Person(val age: Int) {
    init {
        require(age >= 0) { "Age cannot be negative" }
    }
}

fun main() {
    val p = Person(25)
    println(p.age)
}

执行顺序

属性初始化器和init代码块会按照它们在类中出现的顺序从上到下运行。

当某一行依赖上方设置的值时,这一点就很重要。

class Demo {
    val a = 1
    init { println("a is " + a) }
    val b = a + 1
    init { println("b is " + b) }
}

fun main() {
    Demo()
}

计算属性

您可以在类体中根据构造函数的值计算属性。

这里的area由width和height计算得出。

class Rect(val width: Int, val height: Int) {
    val area = width * height
}

fun main() {
    println(Rect(3, 4).area)
}

次构造函数

类也可以使用constructor关键字定义次构造函数。它们必须通过this(...)委托给主构造函数。

由于默认值通常已经足够,因此次构造函数并不常用。

class Dog(val name: String) {
    constructor() : this("Unknown")
}

fun main() {
    println(Dog().name)
}

使用新对象

构造函数和init运行完毕后,对象就可以使用了。您可以立即读取它的属性并调用它的方法。

这里,构造函数设置了余额,而一个方法从余额中扣除支出。

class Account(var balance: Int) {
    fun spend(amount: Int) {
        balance = balance - amount
    }
}

fun main() {
    val acc = Account(100)
    acc.spend(30)
    println(acc.balance)
}

构造函数为对象做好准备

构造函数和init代码块可以确保每个对象都从有效状态开始。

  • 主构造函数:声明并接收值。
  • init:执行初始化和验证。

这样可以避免应用中出现未完整构建的对象。

快速检查

测试您对构造函数和 init 的理解。

回顾

您学习了主构造函数,了解了如何在其中使用val/var声明属性,以及如何为属性设置默认值。

init代码块负责初始化和验证,并会与属性初始化器一起从上到下运行。接下来,您将学习数据类,它可以自动为您生成这些样板代码。

常见问题解答

「构造函数与 init」课时是免费的吗?

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

「构造函数与 init」这节课中我会学到什么?

创建并初始化对象。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

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

「构造函数与 init」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 声明函数
  2. 类与属性
  3. 构造函数与 init
  4. 数据类
← 返回 Android Academy