我遇到了一些关于kotlin顶级属性的问题,下面是示例代码:
// Situation 1
class TreeNode(var `val`: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
val tree2 = TreeNode(2)
val tree1 = TreeNode(3).apply { left = tree2 }
fun main() {
println(tree1.left) // prints "TreeNode@..."
}
// Situation 2
class TreeNode(var `val`: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
val tree1 = TreeNode(3).apply { left = tree2 }
val tree2 = TreeNode(2)
fun main() {
println(tree1.left) // prints "null"
}
// Situation 3
class TreeNode(var `val`: Int) {
var left: TreeNode? = throw Exception("I am an exception")
var right: TreeNode? = null
}
val tree1 = TreeNode(3).apply { left = tree2 }
val tree2 = TreeNode(2)
fun main() {
/* prints "Exception in thread "main" java.lang.ExceptionInInitializerError
* Caused by: java.lang.Exception: I am an exception ..."
*/
println(tree1.left)
}
看来
- 从上到下初始化顶级属性;
- 如果依赖属性没有初始化,它将被默认值替换;
我说得对吗?如果是,我想知道
- 有没有官方文件说这种行为?
- 如果依赖属性尚未初始化,为什么它宁愿用默认值替换它,而不是出现编译时错误或抛出运行时错误,即tree2未初始化?
谢谢