面试题答案
一键面试- 能否重写伴生对象中的函数:
- 在大多数编程语言中(以Kotlin为例),伴生对象中的函数不能在子类中重写。原因是伴生对象本质上是与类相关联的一个对象,而不是类的实例成员。它更像是一个类级别的单例对象,不属于继承体系中实例方法的范畴。
- 伴生对象在继承体系中的特性:
- 共享性:伴生对象对于类的所有实例是共享的,类似于类的静态成员(在Java中有类似概念)。例如在Kotlin中:
open class A {
companion object {
fun commonFunction() {
println("This is a function in A's companion object")
}
}
}
class B : A() {
// 这里不能重写A的伴生对象中的commonFunction
}
- 类相关联:伴生对象与类紧密相关联,它的生命周期与类的加载等机制相关。它可以访问类的私有成员(在Kotlin中可以,因为它在类的作用域内),这使得它可以作为一个便捷的工具类来存放与类相关的操作,而不需要创建类的实例。例如,它可以用于工厂方法的实现:
open class Shape {
companion object {
fun createCircle(radius: Double): Shape {
return Circle(radius)
}
}
}
class Circle(val radius: Double) : Shape()
这里伴生对象的createCircle
方法可以创建Shape
的具体子类Circle
的实例,方便在不直接实例化Circle
类的情况下创建对象。