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

And*_*hov 5 java shadowing kotlin

我在 Kotlin 中有以下代码片段。我喜欢这样的代码难题,但这里的结果对我来说太出乎意料了。有人可以描述我为什么打印1而不是打印2吗?

由于 Java 中禁止阴影 - 看起来我完全不明白它在 Kotlin 中是如何工作的。

fun main() {
    var a = 1
    class A {
        var a = 2

        fun foo() = a
    }

    println(A().foo())
}
Run Code Online (Sandbox Code Playgroud)

============ 奖金 ============

有趣的是,当您var a = 1在类声明后移动时以下代码工作正常并打印2

fun main() {
    
    class A {
        var a = 2

        fun foo() = a
    }

    var a = 1
    println(A().foo())
}
Run Code Online (Sandbox Code Playgroud)

UPD:看起来 Kotlin 突然决定像 C++ 一样玩并且有未定义的行为:D

科特林规格use this with caution, because in some cases it can be called instead

Apl*_*123 3

当您var a = 2在 内部执行此操作时class A您实际上并没有隐藏任何变量。您声明这是class 的a一个字段A,并且默认为 2。

当您在类前面引用变量时,如果存在具有该名称的字段但没有具有该名称的上层变量,this Kotlin 将添加一个隐式(例如a变为) 。因此,外部优先于字段,并且您必须使用来访问内部。this.aathis.aa