0Pricing
Kotlin Academy · 课时

companion object:Kotlin 中类似静态的成员

在类中添加伴生对象,以模拟静态方法和常量。

companion object:Kotlin 中类似静态的成员 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

没有 static,但有伴生对象

Kotlin 没有 static 关键字。相反,在类内部声明的伴生对象可以提供类级别(类似静态)的成员。

声明伴生对象

将 companion object 放在类内部。它的成员可以通过 ClassName.member 调用。

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

伴生对象中的常量

常量通常放在伴生对象中,并经常使用 const val 表示编译期字面量。

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

命名伴生对象

您可以为伴生对象命名。ClassName.member 和 ClassName.CompanionName.member 两种写法都可以使用。

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

工厂方法模式

使用伴生对象,通过验证逻辑或替代构造逻辑来创建实例。

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

实现接口

伴生对象本身可以实现接口——这对于与需要类似静态契约的类结合使用非常有用。

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

用于 Java 互操作的 @JvmStatic

为伴生对象成员添加 @JvmStatic 注解,即可将它们作为真正的静态方法暴露给 Java 调用方。

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

访问伴生对象本身

ClassName.Companion 直接引用伴生对象。在将其作为参数传递时可以使用这种方式。

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

伴生对象与顶层函数

对于不属于任何类的工具函数,优先使用顶层函数,而不是创建一个只有伴生对象的类。

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

每个类只能有一个伴生对象

一个类最多只能有一个伴生对象。如果需要,可以使用内部普通对象保存额外的共享状态。

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

伴生对象扩展函数

您可以在类的外部扩展伴生对象,为其添加伪静态辅助函数。

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

快速检查

Kotlin 中与 Java 的 static 成员等价的是什么?

回顾

Kotlin 没有 static。请使用伴生对象定义类级成员,例如常量、工厂和接口实现。与 Java 互操作时添加 @JvmStatic 注解,也可以使用扩展函数添加伪静态辅助函数。

常见问题解答

「companion object:Kotlin 中类似静态的成员」课时是免费的吗?

是的 — 「companion object:Kotlin 中类似静态的成员」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「companion object:Kotlin 中类似静态的成员」这节课中我会学到什么?

在类中添加伴生对象,以模拟静态方法和常量。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「companion object:Kotlin 中类似静态的成员」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. object 声明:Kotlin 单例
  2. companion object:Kotlin 中类似静态的成员
  3. 匿名对象与对象表达式
  4. 使用 companion object 创建工厂方法
← 返回 Kotlin Academy