Javaを使用すると、開発者は別のクラス内でクラスを定義することができます。そのようなクラスはネストされたクラスと呼ばれます。ネストされたクラスは、非静的であると宣言された場合は内部クラスと呼ばれ、そうでない場合は静的なネストされたクラスと呼ばれます。このページは、Javaの入れ子クラスと内部クラスの使用方法の例を文書化し、詳細を提供するためのものです。
Java言語仕様(JLS)は、さまざまな種類のJavaクラスを次のように分類します。
トップレベルのクラスは、ネストされたクラスではないクラスです。
ネストされたクラスは、他のクラスまたはインタフェースの本体内で宣言が発生する任意のクラスです。
内部クラスは、静的に明示的または暗黙的に宣言されていないネストされたクラスです。
内部クラスは、 非静的メンバークラス 、 ローカルクラス 、または匿名クラスです。インターフェイスのメンバクラスは暗黙的に静的であるため、内部クラスとはみなされません。
実際にプログラマーは、内部クラスを「外部クラス」として含む最上位レベルのクラスを参照します。また、静的ネストされたクラスのみを(明示的または暗黙的に)参照するために「ネストされたクラス」を使用する傾向があります。
匿名の内部クラスとlambdaは密接な関係にありますが、lambdasはクラスです。
トップレベルのクラスは「基本ケース」です。これらは、アクセス修飾子のセマンティクスに基づいた通常の可視性規則の対象となるプログラムの他の部分にも見えます。非抽象クラスの場合、関連するコンストラクタがアクセス修飾子に基づいて表示されるコードでインスタンス化できます。
静的なネストされたクラスは、次の2つの例外を除いて、トップレベルのクラスと同じアクセスおよびインスタンス化のルールに従います。
private
クラスとして宣言することができ、そのクラスを囲むトップレベルクラスの外部ではアクセスできなくなります。 private
メンバーとテスト済みのクラスにアクセスできます。 静的なネストされたクラスは、厳密な抽象境界内に複数の「エンティティタイプ」を表現する必要がある場合に便利です。たとえば、ネストしたクラスを使用して「実装の詳細」を隠す場合
内部クラスは、囲みスコープで宣言された非静的変数にアクセスする機能を追加します。
final
。 (Java 8以降では、 効果的に最終的に使用できます)。 内部クラス・インスタンスが、囲むクラス・インスタンス内の変数を参照できるという事実は、インスタンス化に意味を持ちます。具体的には、内部クラスのインスタンスが作成されるときに、包含するインスタンスを暗黙的または明示的に提供する必要があります。