ネストされたクラスと内部クラス
クラスは他のクラスの中に入れ子にすることができます:
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
インターフェースでもネストが出来ます。インターフェースとクラスのどの組み合わせも可能です: インターフェースの中にクラスを入れたり、クラスの中にインターフェースを入れたり、インターフェースの中にインターフェースを入れたり出来ます。
interface OuterInterface {
class InnerClass
interface InnerInterface
}
class OuterClass {
class InnerClass
interface InnerInterface
}
内部クラス
(訳注:inner class)
ネストしたクラスにinner としてマークすると、 外側のクラスのメンバーにアクセスできるようになります。 この内部クラスは、外側のクラスのオブジェクトへの参照をもちます:
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
内部クラス内での this の曖昧さ回避について学びたければ、限定子付きthisを参照してください。
無名内部クラス
無名内部クラスのインスタンスはobject式を使用して作成されます:
window.addMouseListener(object: MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})
JVMでは、もしオブジェクトが関数型Javaインターフェース(つまり抽象メソッド一つだけのJavaインターフェースのこと)のインスタンスの場合、 インタフェースの型が前に付いたラムダ式を使用してオブジェクトを作成できます。
val listener = ActionListener { println("クリックされたよ") }