クラス内に、staticとして宣言されたクラスは「ネストしたクラス」として外部から利用できます。
クラス内に宣言されたインターフェースは「ネストしたインターフェース」として外部から利用できます。
クラス内に宣言されたインターフェースは、暗黙的にstaticになるので、staticを付けなくてもstatic修飾子が付いたものとして扱われます。
┏クラス━━━━━━━━━━━┓ ┃┏staticクラス━━━━━━┓┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━┛┃ ┃┏staticインターフェース━┓┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━┛┃ ┗━━━━━━━━━━━━━━┛
package sample; public class MyClass { // 「ネストしたクラス」 public static class NstCls { } // 「ネストしたインターフェース」 // インターフェースは暗黙的にstaticになる public interface NstIntr { public void method(); } }
ネストしたクラスやインターフェースは、外部からは「クラス名.ネストしたクラス名」とすることで利用できます。クラス名とネストしたクラス名は「.(ピリオド)」で区切ります。
// 「ネストしたクラス」を外部から作成 MyClass.NstCls nstCls= new MyClass.NstCls(); // 「ネストしたインターフェース」を外部から実装 MyClass.NstIntr nstIntr = new MyClass.NstIntr() { @Override public void method() { } };
「クラス名.ネストしたクラス名」という書き方が面倒な場合は、import文でネストしたクラスをインポートすることもできます。
import sample.MyClass.NstCls;
// 「ネストしたクラス」を外部から作成
NstCls nstCls= new NstCls();