1.概念
在對象聲明的前面加上companion關鍵字就生成了伴生對象。作用就是為其所在的外部類模擬靜態成員。
語法:(ObjectName可省略)
companion object ObjectName : [0~N個父類型] {
//伴生對象類體
}
2.特點
- 每個類最多定義一個伴生對象;
- 伴生對象相當於外部類的對象,可以直接通過外部類名訪問伴生對象的成員;
- 由於kotlin取消了static關鍵字,伴生對象是為了彌補kotlin沒有static關鍵字修飾的靜態成員的不足;
- 雖然伴生對象是為其所在對象模擬靜態成員,但是伴生對象成員依然屬於伴生對象本身的成員,而不屬於其外部類的成員。
3.定義伴生對象
fun main() {
println(OuterClass.name)//伴生對象屬性
OuterClass.companionFun()//調用伴生對象方法
OuterClass.CompanionObjectName//通過伴生對象名稱獲取伴生對象本身
}
class OuterClass {
companion object CompanionObjectName {
val name = "伴生對象屬性"
fun companionFun() {
println("調用伴生對象方法")
}
}
}
4.省略伴生對象名字
伴生對象名稱可以省略,省略伴生對象名稱后,如果想獲取伴生對象本身,可以通過Companion獲取。
fun main() {
println(OuterClass.name)//伴生對象屬性
OuterClass.companionFun()//調用伴生對象方法
OuterClass.Companion//通過Companion獲取伴生對象本身
}
class OuterClass {
companion object {
val name = "伴生對象屬性"
fun companionFun() {
println("調用伴生對象方法")
}
}
}
5.為伴生對象擴展成員
為伴生對象擴展成員,如果伴生對象有名字,則通過“外部類.伴生對象名字.成員”的方式擴展;
如果伴生對象沒名字,則通過“外部類.Companion.成員”的方式擴展
fun main() {
println(OuterClass.name)//伴生對象屬性
OuterClass.companionFun()//調用伴生對象方法
println(OuterClass.extraParam)//為伴生對象擴展屬性
OuterClass.test()//為伴生對象擴展方法
}
class OuterClass {
companion object {
val name = "伴生對象屬性"
fun companionFun() {
println("調用伴生對象方法")
}
}
}
/**
* 為伴生對象擴展方法
*/
fun OuterClass.Companion.test() {
println("為伴生對象擴展方法")
}
/**
* 為伴生對象擴展屬性
*/
val OuterClass.Companion.extraParam: String
get() = "為伴生對象擴展屬性"