0
点赞
收藏
分享

微信扫一扫

【错误记录】Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )


文章目录

  • ​​一、报错信息​​
  • ​​二、问题分析​​
  • ​​三、解决方案​​



该问题的本质就是 , 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ;






一、报错信息


执行下面的代码 :

class Hello(_age: Int){
var name: String = initName()
var age = _age

fun initName() = "Tom $age"
}

fun main() {
var h = Hello(18)
println(h.name)
}

得到的结果是 :

Tom 0

在上述代码的构造函数中 , 传入了 _age 临时变量值为 18 , 给 age 赋值 18 , 但是最终打印出来的数据为 0 ;






二、问题分析


Kotlin 类 对象在实例化 时会执行一系列的 初始化操作

  • 主构造函数
  • 类中的属性赋值
  • init 初始化块
  • 次构造函数


在下面的代码中 ,

class Hello(_age: Int){
var name: String = initName()
var age = _age

fun initName() = "Tom $age"
}

首先 , 主构造函数 中 只提供了一个临时变量 _age , 没有对成员属性赋值 ;

然后 , 开始对 类中的属性赋值 , 先给 name 属性赋值 , 该赋值调用了 initName 函数 , 在该函数中调用了 age 成员属性 , 但是此时 age 属性还没有赋值 , 使用的是默认值 0 ; 之后才对 age 进行赋值 ;

因此最终打印出的 name 结果是 ​​Tom 0​​ ;






三、解决方案


成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 ;

调换 age 属性与 name 属性的顺序 , 先对 age 进行赋值 , 即可得到想要的结果 ;

class Hello(_age: Int){
var age = _age
var name: String = initName()

fun initName() = "Tom $age"
}

fun main() {
var h = Hello(18)
println(h.name)
}

执行结果 :

Tom 18


举报

相关推荐

44. UE5 RPG 初始化敌人的属性

0 条评论