我在kotlin中有以下代码片段。我喜欢这样的代码拼图,但是这里的结果对我来说太出乎意料了。有人能描述一下它为什么会打印吗 1
而不是 2
?
因为java中禁止阴影-看起来我完全不明白它在kotlin中是如何工作的。
fun main() {
var a = 1
class A {
var a = 2
fun foo() = a
}
println(A().foo())
}
=============奖金============
有趣的是,下面的代码当你将移动 var a = 1
下课后申报工作顺利完成 2
:
fun main() {
class A {
var a = 2
fun foo() = a
}
var a = 1
println(A().foo())
}
upd:看起来kotlin突然决定像c++一样玩,并且有未定义的行为:d
根据kotlin规范: use this with caution, because in some cases it can be called instead
.
1条答案
按热度按时间m1m5dgzv1#
当你这么做的时候
var a = 2
内部class A
,实际上你没有隐藏任何变量。你在宣布a
是一个阶级的领域A
,默认为2。在类前面引用变量时,kotlin将添加隐式
this
(例如。a
变成this.a
)如果有具有该名称的字段,但没有具有该名称的上层变量。所以,外部a
优先于字段,您必须使用this.a
进入内部a
.