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

时间:2019-03-04 19:07:53

标签: 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
}

不幸的是,我无法使用它:

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

我该如何解决我的问题?

3 个答案:

答案 0 :(得分:5)

当您这样做:

A("test").B

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

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

因此,您还需要初始化B。 Kotlin的语法非常不错(就像Java is slightly horrible中的语法一样)-您最后需要添加的内容就是()

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

val b = A("test").B()
// ...

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

您还可以拆分初始化:

val a = A("test")
val b = a.B(); 

一旦有了变量,它就与其他变量完全一样-唯一的区别是初始化。

答案 1 :(得分:0)

您应该在访问类B的成员之前创建一个实例(调用构造函数):

fun main(args:Array<String>) {
    val b = A("test").B()
    b.someFunction() 
}


class A {
    var myVariable:String? = null

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

    init {
        println("Success !")
    } 

    inner class B {
        init {
            println(myVariable)
        }

        fun someFunction() {
            myVariable = "set new value to the variable"
        }
    }
}

答案 2 :(得分:0)

尝试一下:

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() // You have to call the constructor here
}