Looking for java Answers? Try Ask4KnowledgeBase
Looking for java Keywords? Try Ask4Keywords

Java Language入れ子クラスと内部クラス


前書き

Javaを使用すると、開発者は別のクラス内でクラスを定義することができます。そのようなクラスはネストされたクラスと呼ばます。ネストされたクラスは、非静的であると宣言された場合は内部クラスと呼ばれ、そうでない場合は静的なネストされたクラスと呼ばれます。このページは、Javaの入れ子クラスと内部クラスの使用方法の例を文書化し、詳細を提供するためのものです。

構文

  • パブリッククラスOuterClass {public class InnerClass {}} //インナークラスはprivateでもかまいません
  • パブリッククラスOuterClass {public static class StaticNestedClass {}} //静的にネストされたクラスもプライベートにすることができます
  • public void method(){private class LocalClass {}} //ローカルクラスは常にprivateです。
  • SomeClass anonymousClassInstance = new SomeClass(){}; //匿名の内部クラスには名前を付けることができないため、アクセスは疑わしいです。 'SomeClass()'が抽象クラスの場合、ボディはすべての抽象メソッドを実装する必要があります。
  • SomeInterface anonymousClassInstance =新しいSomeInterface(){}; //ボディはすべてのインターフェイスメソッドを実装する必要があります。

備考

用語と分類

Java言語仕様(JLS)は、さまざまな種類のJavaクラスを次のように分類します。

トップレベルのクラスは、ネストされたクラスではないクラスです。

ネストされたクラスは、他のクラスまたはインタフェースの本体内で宣言が発生する任意のクラスです。

内部クラスは、静的に明示的または暗黙的に宣言されていないネストされたクラスです。

内部クラスは、 非静的メンバークラスローカルクラス 、または匿名クラスです。インターフェイスのメンバクラスは暗黙的に静的であるため、内部クラスとはみなされません。

実際にプログラマーは、内部クラスを「外部クラス」として含む最上位レベルのクラスを参照します。また、静的ネストされたクラスのみを(明示的または暗黙的に)参照するために「ネストされたクラス」を使用する傾向があります。

匿名の内部クラスとlambdaは密接な関係にありますが、lambdasはクラスです。

意味の違い

  • トップレベルのクラスは「基本ケース」です。これらは、アクセス修飾子のセマンティクスに基づいた通常の可視性規則の対象となるプログラムの他の部分にも見えます。非抽象クラスの場合、関連するコンストラクタがアクセス修飾子に基づいて表示されるコードでインスタンス化できます。

  • 静的なネストされたクラスは、次の2つの例外を除いて、トップレベルのクラスと同じアクセスおよびインスタンス化のルールに従います。

    • ネストされたクラスはprivateクラスとして宣言することができ、そのクラスを囲むトップレベルクラスの外部ではアクセスできなくなります。
    • ネストされたクラスは、囲んでいるトップレベルクラスのprivateメンバーとテスト済みのクラスにアクセスできます。

    静的なネストされたクラスは、厳密な抽象境界内に複数の「エンティティタイプ」を表現する必要がある場合に便利です。たとえば、ネストしたクラスを使用して「実装の詳細」を隠す場合

  • 内部クラスは、囲みスコープで宣言された非静的変数にアクセスする機能を追加します。

    • 非静的メンバークラスはインスタンス変数を参照できます。
    • メソッド内で宣言されたローカルクラスは、メソッドのローカル変数を参照することもできます(ただし、それらがfinal 。 (Java 8以降では、 効果的に最終的に使用できます)。
    • 匿名の内部クラスは、クラスまたはメソッド内で宣言することができ、同じ規則に従って変数にアクセスできます。

    内部クラス・インスタンスが、囲むクラス・インスタンス内の変数を参照できるという事実は、インスタンス化に意味を持ちます。具体的には、内部クラスのインスタンスが作成されるときに、包含するインスタンスを暗黙的または明示的に提供する必要があります。

入れ子クラスと内部クラス 関連する例