正如Kotlin in Action所述
在 Kotlin 中,object 关键字在很多情况下都会出现,但它们都具有相同的核心思想:关键字定义一个类并同时创建该类的一个实例(换句话说,一个对象)。
当涉及到普通对象和伴生对象时,唯一显着的区别是伴生对象的属性和函数可以通过使用包含类的名称直接访问,这使得它看起来像 java 静态成员访问。
例如,如果您有以下课程
class Temp{
object Holder{
fun foo() = 1
}
companion object{
fun foo() = "Hello World"
}
}
然后你可以访问这两个对象如下 From 包含类
foo() // call to companion object function
Holder.foo() // call to plain object function
并从课外
Temp.foo() // call to companion object function
Temp.Holder.foo() // call to plain object function
在后台,每个对象声明都会创建一个单例。在伴随对象的情况下,单例对象是在包含类的静态初始化程序中创建的。但是在普通对象的情况下,第一次访问对象类时会延迟创建单例实例。
您可以通过编译 kotlin 类然后使用一些 java 反编译器反编译生成的类文件来自己查看。
至于为什么也有可能在类中声明一个普通对象,请考虑下面的类,其中成员对象非常有用。
data class Employee(val name: String) {
object NameComparator : Comparator<Employee> {
override fun compare(p1: Employee, p2: Employee): Int =
p1.name.compareTo(p2.name)
}
}
现在我们可以将员工列表排序为
list.sortedWith(Employee.NameComparator))