我如何在内部类中使用变量?

0 kotlin

我有使用Kotlin的代码:

class A{
    var myVariable:String?=null

    constructor(myVariable:String){
        this.myVariable = myVariable
    }

    init {
        println("Success !")
    }

    inner class B{
        init {
            println(myVariable)
        }
    }
}

fun main(args:Array<String>){
    var b = A("test").B // this does not work
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它无法正常工作:

Error:(20, 23) Kotlin: Nested class 'B' accessed via instance reference
Error:(20, 23) Kotlin: Classifier 'B' does not have a companion object, and thus must be initialized here
Run Code Online (Sandbox Code Playgroud)

我该如何解决我的问题?

Zoe*_*Zoe 5

当您这样做时:

A("test").B
Run Code Online (Sandbox Code Playgroud)

您说的是“从A的实例中获取内容”-在这种情况下,它是一个类。但是,这不是您要查找的语法。您几乎可以获得任何东西,但是获得参考是一个单独的问题。如果要获取函数,语法与获取字段或调用函数不同。尽管这不是很重要,但还是要记住一点。

由于B是一个内部类,因此到目前为止,您完全正确,因此您首先需要A的实例。但是,您还需要B的实例。初始化B时,它仍然“连接”到父类,这就是为什么您可以毫无问题地访问外部变量的原因。但是,它仍然是可初始化的类-您需要对其进行初始化。

因此,您还需要初始化B。Kotlin的语法非常不错(Java中的语法有点可怕)-您需要添加的只是()最后。

因此,您将得到以下结果:

val b = A("test").B()
// ...
Run Code Online (Sandbox Code Playgroud)

这是因为它是一个内部类。如果您有一个静态内部类(在Kotlin中,这是一个没有inner关键字的类中的类),则初始化将是A.B()-在这种情况下不会初始化A。

您还可以拆分初始化:

val a = A("test")
val b = a.B(); 
Run Code Online (Sandbox Code Playgroud)

有了变量后,它就和其他所有变量一样-唯一的区别是初始化。