为什么下面的代码会打印0
?
class X {
fun f() {
val x = 0
val a = object {
val x = 1
fun g() {
println(x)
}
}
a.g()
}
}
fun main() {
val x = X()
x.f()
}
为什么内部属性声明不会遮蔽外部属性声明?
对于非限定名称,本地可调用(即语句作用域内的声明)始终优先于非本地可调用。“内部作用域中的内容隐藏外部作用域中的内容”规则紧随其后。
从规范的过载解析部分来看,
步骤 1 考虑所有本地可调用函数,然后我们才会在第二步中尝试使用接收器的可调用函数。
将其应用到您的代码中,
x
如果不像这样优先考虑当地人,那么当你在 时,你就无法提到当地人g
。