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 反馈 — 无需本地设置。
此课程中的所有课时
- object 声明:Kotlin 单例
- companion object:Kotlin 中类似静态的成员
- 匿名对象与对象表达式
- 使用 companion object 创建工厂方法