この記事は公式ウェブサイトのチュートリアルノートです:公式ウェブサイトのアドレス
なぜオブジェクト式とオブジェクト宣言を使用するのですか?
場合によっては、新しいサブクラスを明示的に宣言せずに、特定のクラスにわずかな変更を加えたクラスのオブジェクトを作成する必要があります。Kotlinは、オブジェクト式とオブジェクト宣言 を使用してこの状況を処理します 。
まず、オブジェクト式とオブジェクト宣言が別々に実装される方法を見てみましょう。
オブジェクト式 | オブジェクト宣言 |
/ ** *オブジェクト式 * / ①varobj=オブジェクト{
} ②varobj2=オブジェクト:Any(){ } |
/ ** *オブジェクト宣言 * / ③オブジェクトMyObject {
} ④オブジェクトMyObject2:Any(){
} |
オブジェクト表現形式(上記①②に対応) ①オブジェクト{} または②オブジェクト:スーパークラス{}; |
(上記に対応するオブジェクトテーブル申告書③ ④) ③オブジェクトクラス名{}または④オブジェクトクラス名:スーパークラス{ |
概要:オブジェクト式オブジェクトは、名前なしで等号の右側に配置できます。
オブジェクト宣言オブジェクトの後に名前が続く場合は、等号の右側に配置できません。
注:オブジェクト式を使用する場合、匿名オブジェクトは、ローカルスコープとプライベートスコープでのみ宣言された型として使用できます。パブリック関数の戻り値の型またはパブリックプロパティの型として匿名オブジェクトを使用する場合、関数またはプロパティの実際の型は、匿名オブジェクトによって宣言されたスーパータイプになります。スーパータイプを宣言しない場合は、になります Any
。匿名オブジェクトに追加されたメンバーにはアクセスできません。
class C {
// 私有函数,所以其返回类型是匿名对象类型
private fun foo() = object {
val x: String = "x"
}
// 公有函数,所以其返回类型是 Any
fun publicFoo() = object {
val x: String = "x"
}
fun bar() {
val x1 = foo().x // 没问题
val x2 = publicFoo().x // 错误:未能解析的引用“x”
}
}
オブジェクト式 | オブジェクト宣言 |
クラス名のない直接オブジェクト{}、匿名オブジェクトとも呼ばれます | クラス名オブジェクトクラス名{}があります |
代入ステートメントの等号の右側に配置できます | 式ではないため、代入ステートメントの等号の右側に配置できません。 |
オブジェクト式は、使用された場所ですぐに実行(および初期化)されます | オブジェクト宣言は、最初にアクセスされたときに遅延初期化されます |
スーパークラスを継承または実装できます | スーパークラスを継承または実装できます |
================================================== =================
コンパニオンオブジェクト:クラス内のオブジェクト宣言は、コンパニオン キーワードでマークできます 。
class DemoClass {
companion object MyCompanionObject {
fun method(){}
}
}
调用:DemoClass.method()
=====================================
伴生对象的名称可以省略
class DemoClass {
companion object{
}
}
调用: DemoClass.companion
注:コンパニオンオブジェクトは静的クラスによく似ていますが、実行時には実際のオブジェクトのインスタンスメンバーです。たとえば、インターフェイスを実装できます。
interface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
val f: Factory<MyClass> = MyClass
注:コンパニオンオブジェクトの初期化は、対応するクラスがロード(解析)されるときのJava静的初期化子のセマンティクスと一致します。