对 Kotlin 的伴生对象定义感到困惑

shi*_*310 5 kotlin

当我到达电子书“Kotlin in action”中的伴随对象部分时,它说:

如果您需要编写一个无需类实例即可调用的函数,但需要访问类的内部结构,则可以将其编写为该类内部对象声明的成员

据我了解,这意味着伴随对象的函数可以访问包含它的类的方法和属性。但是当我尝试实现这一点时,我无法从其伴随对象的函数访问类的成员:

class Normal() {

var name: String = "hallo"


companion object {
    fun printName() {
        println(name) // ERROR!!! unresolved reference name
    }
}}
Run Code Online (Sandbox Code Playgroud)

我误解了这个概念吗?

RKS*_*RKS 6

companion默认情况下,内部方法是静态的(与 Java 相比,这也是您在 Kotlin 中实现静态类型的方式),并且您无法从静态方法访问普通变量。

这里正在发生同样的事情。

编辑:-

书中的定义令人困惑,伴生对象不是类实例的一部分。您不能从伴随对象访问成员,就像在 Java 中您不能从静态方法访问成员一样。但是对于您只需要执行某些操作的实用程序类,您可以调用静态方法,该方法创建类的新实例并执行一些功能。

例如,您可以通过@user8320224检查答案,我也在此处引用他的代码,

class Normal {
private var name: String = "hallo"
private fun printName() {
    println(name)
}

companion object {
    fun factoryNormal(): Normal {
        val normal = Normal()
        normal.printName()
        normal.name = "new name"
        normal.printName()
        return normal
    }
}
}
Run Code Online (Sandbox Code Playgroud)