Kotlin 伴生對(duì)象(Companion Object)的限制主要包括以下幾點(diǎn):
不能訪問外部類的私有成員:伴生對(duì)象不能直接訪問外部類的私有成員(private, protected),但可以訪問外部類的公有成員和保護(hù)成員。如果需要訪問私有成員,可以通過在外部類中定義一個(gè)公有的靜態(tài)方法來實(shí)現(xiàn)。
不能被實(shí)例化:伴生對(duì)象不能被實(shí)例化,也就是說,你不能使用 new
關(guān)鍵字來創(chuàng)建伴生對(duì)象的實(shí)例。要訪問伴生對(duì)象中的屬性和方法,可以直接通過外部類的名稱來調(diào)用。
伴生對(duì)象中的屬性必須是靜態(tài)的:由于伴生對(duì)象不能被實(shí)例化,因此它們中的屬性必須是靜態(tài)的(val)或常量(const)。這樣可以確保屬性在所有實(shí)例之間共享。
伴生對(duì)象中的方法不能被重載:在同一個(gè)類中,伴生對(duì)象中的方法不能與其他靜態(tài)方法重載。這意味著你不能為同一個(gè)類創(chuàng)建多個(gè)具有相同名稱但參數(shù)列表不同的靜態(tài)方法。
伴生對(duì)象中的方法不能被繼承:伴生對(duì)象中的方法是靜態(tài)的,因此它們不會(huì)被繼承。子類無法覆蓋或重寫父類伴生對(duì)象中的方法。
伴生對(duì)象中的方法不能被隱藏:伴生對(duì)象中的方法與外部類的非靜態(tài)方法同名時(shí),它們不會(huì)被隱藏。實(shí)際上,這種情況下,外部類的非靜態(tài)方法會(huì)被伴生對(duì)象中的方法覆蓋。
伴生對(duì)象中的方法不能被接口繼承:伴生對(duì)象中的方法是靜態(tài)的,因此它們不會(huì)被接口繼承。接口只能包含靜態(tài)常量和抽象方法(Java 8 之后支持默認(rèn)方法和靜態(tài)方法)。