在Kotlin中,伴生对象(Companion Object)是一种特殊的单例对象,将某个对象的初始化和一个类实例捆绑在一起,它允许开发者为类提供静态方法和属性。
kotlin没有 static 关键字,伴生对象是为弥补kotlin没有 static 修饰的静态成员的不足。
声明伴生对象的语法:
companion object ObjectName : [0~N个父类型] { //伴生对象类体 }
在MyClass类中声明伴生对象:
class MyClass {
companion object {
// 在这里定义伴生对象的属性和方法
const val MY_CONSTANT = "Hello, World!"
fun myFunction() {
println("This is a function inside a companion object.")
}
}
}
对于存在父类的情况,示例如下:
// 定义一个接口
interface MyInterface {
fun doSomething()
}
// Kotlin类,其伴生对象实现了MyInterface接口
class MyClass {
companion object : MyInterface {
override fun doSomething() {
println("Doing something in the companion object!")
}
// 伴生对象还可以有其他方法和属性
fun anotherFunction() {
println("Another function in the companion object.")
}
}
}
companion object的特点概括如下:
(1) 伴生对象相当于类的对象,可直接通过类名访问伴生对象的成员。
(2) 每个类最多定义一个伴生对象。
(3) 只有在类实例化或是调用伴生对象的函数时,伴生对象才会初始化,才会加载到内存。
(4) 伴生对象里的方法就类似Java里的static方法的实现。
(5) 伴生对象的作用域仅限于定义它的类本身,也就是说,它的成员只能在定义它的类内部访问(通过类名),而不能在其他类中直接访问。
companion object作用概括如下:
(1) 提供静态方法和属性:伴生对象允许为类提供静态方法和属性,这样可以在不创建类实例的情况下调用这些方法和访问这些属性。这有助于将相关的静态功能和数据组织在一起,提高代码的可读性和可维护性。
(2) 延迟初始化:伴生对象的属性和方法可以在首次访问时进行初始化,而不是在类加载时立即初始化。这有助于提高程序的启动速度和性能,特别是在处理资源密集型操作时。
companion object使用方式概括如下:
在Kotlin下,可以通过类名直接访问伴生对象的属性和方法。
fun main() {
// 访问伴生对象的属性和方法
println(MyClass.MY_CONSTANT) // 输出: Hello, World!
MyClass.myFunction() // 输出: This is a function inside a companion object.
}
在Java下,也可以访问Kotlin中的伴生对象,但需要在kontlin中声明伴生对象时加上注解使得在Java中看起来是静态的。
class MyClass {
companion object {
@JvmStatic
fun staticFunction() {
println("This is a static function in MyClass companion object.")
}
@JvmField
var staticField: String = "This is a static field in MyClass companion object."
}
}
上面的代码中使用了 @JvmStatic 注解来确保staticFunction在Java中看起来是静态的,以及 @JvmField 注解来确保staticField在Java中作为静态字段暴露。 那么在Java类文件中就可以调用伴生对象的方法和熟悉了。
MyClass.staticFunction(); // 输出: This is a static function in MyClass companion object.
System.out.println(MyClass.staticField); // 输出: This is a static field in MyClass companion object.
如果不使用注解,则只能通过Companion来访问。
MyClass.Companion.staticFunction();
MyClass.Companion..getStaticField();
Kotlin编译器会为每个伴生对象生成一个名为Companion的内部类,并且这个内部类会有一个静态的INSTANCE属性。