# Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解 站点:答源(https://www.dandroid.cn/) 原文:https://www.dandroid.cn/archives/19800 Canonical:https://www.dandroid.cn/archives/19800 作者:admin 发布日期:2023-09-10 最后更新:2023-09-10 06:56 分类:Kotlin 内容类型:post 说明:本页是原文的纯文本镜像,供大模型与检索器完整读取;不含导航、广告、付费框。引用请以上方「原文」链接为准。 ## 正文 1、初始化块:初始化块可以设置变量或值,以及执行有效性检查,如检查传给某构造函数的值是否有效,初始化块代码会在构造类实例时执行。 案例代码如下: class Player3( _name: String, var age: Int = 20, var isNormal: Boolean ) { var name = _name get() = field.capitalize() set(value) { field = value.trim() } //次构造函数 //我们可以定义多个次构造函数来配置不同的参数组合 constructor(name: String) : this(name, age = 100, isNormal = false) constructor(name: String, age: Int) : this(name, age = 10, isNormal = false) { println("次构造函数") this.name = name.toUpperCase() } init { println("测试init") require(age > 0) { "age muse be positive" } require(name.isNotBlank()) { "player must have a name" } } } fun main() { val player = Player3(isNormal = false, _name = "Jack") println("${player.name}, ${player.age}, ${player.isNormal}") val p = Player3("Android", 10) println("${p.name},${p.age},${p.isNormal}") } 输出结果如下: 测试init Jack, 20, false 测试init 次构造函数 ANDROID,10,false 2.初始化执行的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 案例代码如下: class Students( _name: String, val age: Int ) { var name = _name var score = 10 private val hobby = "music" val subject: String //初始化块 init { println("initializing Students...") subject = "math" } constructor(_name: String) : this(_name, 10) { score = 20 } } fun main() { Students("Jack") } 可以通过反编译看java代码,就清楚了,反编译代码如下 public final class StudentsKt { public static final void main() { new Students("Jack"); } // $FF: synthetic method public static void main(String[] var0) { main(); } } // Students.java package kotlin04; import kotlin.Metadata; import kotlin.jvm.internal.Intrinsics; import org.jetbrains.annotations.NotNull; @Metadata( mv = {1, 6, 0}, k = 1, d1 = {"u0000u001anu0002u0018u0002nu0002u0010u0000nu0000nu0002u0010u000enu0002bu0002nu0002u0010bnu0002bu000fu0018u00002u00020u0001Bu000fbu0016u0012u0006u0010u0002u001au00020u0003¢u0006u0002u0010u0004Bu0015u0012u0006u0010u0002u001au00020u0003u0012u0006u0010u0005u001au00020u0006¢u0006u0002u0010u0007Ru0011u0010u0005u001au00020u0006¢u0006bnu0000u001au0004bbu0010tRu000eu0010nu001au00020u0003Xu0082D¢u0006u0002nu0000Ru001au0010u000bu001au00020u0003Xu0086u000e¢u0006u000enu0000u001au0004bfu0010r"u0004bu000eu0010u0004Ru001au0010u000fu001au00020u0006Xu0086u000e¢u0006u000enu0000u001au0004bu0010u0010t"u0004bu0011u0010u0012Ru0011u0010u0013u001au00020u0003¢u0006bnu0000u001au0004bu0014u0010r¨u0006u0015"}, d2 = {"Lkotlin04/Students;", "", "_name", "", "(Ljava/lang/String;)V", "age", "", "(Ljava/lang/String;I)V", "getAge", "()I", "hobby", "name", "getName", "()Ljava/lang/String;", "setName", "score", "getScore", "setScore", "(I)V", "subject", "getSubject", "kotlinStudy"} ) public final class Students { @NotNull private String name; private int score; private final String hobby; @NotNull private final String subject; private final int age; @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String var1) { Intrinsics.checkNotNullParameter(var1, ""); this.name = var1; } public final int getScore() { return this.score; } public final void setScore(int var1) { this.score = var1; } @NotNull public final String getSubject() { return this.subject; } public final int getAge() { return this.age; } public Students(@NotNull String _name, int age) { Intrinsics.checkNotNullParameter(_name, "_name"); super(); this.age = age; this.name = _name; this.score = 10; this.hobby = "music"; String var3 = "initializing Students..."; System.out.println(var3); this.subject = "math"; } public Students(@NotNull String _name) { Intrinsics.checkNotNullParameter(_name, "_name"); this(_name, 10); this.score = 20; } } 3、延迟初始化lateinit class Player4 { lateinit var equipment: String fun ready() { equipment = "sharp knife" } fun battle() { if (::equipment.isInitialized) {//该属性初始化,执行该代码 println(equipment) } } } fun main() { val p = Player4() p.ready() p.battle() } 输出结果 sharp knife   文章来源于互联网:Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解 --- 由 答源 DAN 底座 1.4.1 生成 · 2026-11-12T23:23:52+00:00