English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 套嵌と内部クラス

この記事では、例を用いてネストされたクラスおよび内部クラスの使用方法を学びます。

Kotlin ネストされたクラス

Javaと同様に、Kotlinでは、ネストされたクラスと呼ばれる別のクラス内にクラスを定義することができます。

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

ネストされたクラスが閉じたクラスの外部(Outer)メンバーであるため、. 符号を使用してネストされたクラスおよびそのメンバーにアクセスできます。

例:Kotlin ネストされたクラスの使用例

class Outer {
    val a = "在嵌套类外部。"
    class Nested {
        val b = "ネストされたクラス内で。"
        fun callMe() = "ネストされたクラス内で関数を呼び出します。"
    }
}
fun main(args: Array<String>) {
    //ネストされたクラスのメンバーにアクセスします
    println(Outer.Nested().b)
    //ネストされたクラスのオブジェクトを作成します
    val nested = Outer.Nested()
    println(nested.callMe())
}

プログラムを実行すると、出力は以下のようになります:

ネストされたクラス内で。
ネストされたクラス内で関数を呼び出します。

Javaユーザー向け

KotlinのネストされたクラスはJavaの静的ネストされたクラスに似ています。

Javaでは、別のクラス内にクラスを宣言すると、デフォルトで内部クラスとなります。しかし、Kotlinではinner修飾子を使用して内部クラスを作成する必要があります。これについて以下に説明します。

Kotlin 内部クラス

Kotlinのネストされたクラスは外部クラスのインスタンスにアクセスする権限がありません。例えば、

class Outer {
    val foo = "ネストされたクラス外部で。"
    class Nested {
        //エラー! 外部クラスのメンバーにアクセスできません。
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

上記のコードはコンパイルできません。なぜなら、ネストされたクラス内から外部クラスのfoo属性にアクセスしようとしました。

この問題を解決するために、inner 修飾子でネストされたクラスを内部クラスとして作成する必要があります。内部クラスは外部クラスの参照を持ち、外部クラスのメンバーにアクセスできます。

例:Kotlin 内部クラスの使用

class Outer {
    val a = "在嵌套类外部。"
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("外部オブジェクトの使用: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("内部オブジェクトの使用: ${inner.callMe()}")
}

プログラムを実行すると、出力は以下のようになります:

外部オブジェクトの使用: 嵌套クラスの外部。
内部オブジェクトの使用: 嵌套クラスの外部。