内部类kotlin中的java变量阴影:如何解析变量?

hyrbngr7  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(404)

我在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 .

m1m5dgzv

m1m5dgzv1#

当你这么做的时候 var a = 2 内部 class A ,实际上你没有隐藏任何变量。你在宣布 a 是一个阶级的领域 A ,默认为2。
在类前面引用变量时,kotlin将添加隐式 this (例如。 a 变成 this.a )如果有具有该名称的字段,但没有具有该名称的上层变量。所以,外部 a 优先于字段,您必须使用 this.a 进入内部 a .

相关问题