Javaでネストされたクラス

高洛峰
リリース: 2016-11-05 16:31:23
オリジナル
2461 人が閲覧しました

Java では、あるクラスを別のクラス内で定義することができます。これはクラスのネストと呼ばれます。クラスの入れ子には 2 つのタイプがあり、静的なものは静的入れ子クラスと呼ばれ、静的でないものは内部クラスと呼ばれます。

ネストされたクラスを使用する理由:

1 か所でのみ使用されるクラスを合理的な方法で結合できるようにする。この場合、前者と後者を組み合わせることで、パッケージをより簡潔にすることができます。

カプセル化を強化します。 2 つのクラス A と B がある場合、クラス B はクラス A のメンバーを使用する必要がありますが、このメンバーはクラス内でのみ表示されます。B が A のネストされたクラスとして定義されている場合、B はクラス A の任意のメンバーを使用できます。 A. および B は、外部から不可視であると宣言することもできます。

コードをより読みやすく、保守しやすくすることができます。ネストされたクラス コードは、最上位クラスよりも使用される場所に近いため、見やすくなります。

ネストされたクラスもクラスのメンバーであるため、クラス メンバーの可視スコープ制御修飾子を使用することもできます。内部クラスは、そのクラスが配置されているクラスの他のクラス メンバーを使用できますが、静的にネストされたクラスは、クラスの他のクラス メンバーを使用できません。クラスのメンバーがいるクラス。

静的入れ子クラス

静的メソッドや静的フィールドと同様に、静的入れ子クラスは、それが配置されているクラスに関連付けられています。静的ネストされたクラスは、インスタンス変数またはインスタンス フィールドを直接使用できませんが、オブジェクトを通じてのみ参照できます。静的ネストされたクラスは、他のトップレベル クラスと同じと見なされますが、パッケージ化を容易にするために他のクラスに埋め込まれます。

静的ネストされたクラスの使用は、クラス内の他のクラス メンバーと同様です。 ここでは、静的ネストされたクラス オブジェクトを作成する方法を示します。

//StaticNestedClass为OuterClass的一个嵌套类OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
ログイン後にコピー

内部クラス (非静的ネストされたクラス)

内部クラスは次のとおりです。関連: インスタンス オブジェクトのメソッドとフィールドは直接使用できるため、内部クラスは静的メンバーを定義できません。

内部クラス オブジェクトを作成する必要がある場合は、以下に示すように、まず内部クラスが配置されているクラスのオブジェクトを作成する必要があります:

//1创建内部类所在类的对象OuterClass outerObject=new OuterClass();//2创建内部类对象
//注意与静态嵌套类的构造器使用方法的差异OuterClass.InnerClass innerObject = outerObject.new InnerClass();
ログイン後にコピー

ネストされたクラスのシェーディング

型を宣言するとき、その型が名前が現在のコード ブロックと同じです (たとえば、同じコード ブロック内 (クラス内など) の別の型の宣言に同じ名前が含まれています。この現象はマスキングと呼ばれます。次の例に示すように、シェーディング タイプを使用する必要がある場合、その名前を直接参照することはできません:

public class ShadowTest {

    public int x = 0;
//嵌套类
    class FirstLevel {
//以下声明会遮蔽其所在类的名称为x的字段
        public int x = 1;
//以下方法的声明会遮蔽其所在类的名称为x的字段
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//注意this关键词的使用方法
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}
ログイン後にコピー

上記のコードの出力は次のとおりです:

x = 23
this.x = 1
ShadowTest.this。 x = 0

シリアル化。チュートリアルでは内部クラスをシリアル化しないことを強く推奨しており、質問はここに残しています。

非静的ネストされたクラスに加えて、2 種類の内部クラスもあります。1 つはローカル クラス、もう 1 つは匿名クラスです。

部分クラス

部分クラスは任意のコード ブロック (中括弧内) で定義でき、通常はメソッドで使用されます。

ローカル クラスは、そのクラスが配置されている最上位クラスのクラス メンバーを使用できます。さらに、ローカル クラスはローカル変数も使用できます。ただし、使用するローカル クラスは、final キーワード、つまり immutable で変更する必要があります。変数。 Java SE8 では、ローカル クラスは本質的に変更されていないローカル変数を使用できます。つまり、ローカル変数が Final キーワードで変更されていない場合でも、その値は初期化されてから一度も変更されていません。

Java8 以降、ローカルクラスもメソッドのパラメータを使用できるようになりました。

内部クラスと同様に、ローカル クラスは静的メンバーを定義できず、静的メソッドで定義されたローカル クラスはインスタンス メンバーを使用できません。

インターフェースは本質的に静的であるため、コードブロック内でインターフェースを定義することはできません。 Excuse メンバーはローカル クラスで定義できませんが、定数変数はローカル クラスで定義できます (final で変更され、型は基本データ型または文字列で、コンパイル時に初期化されます)。

匿名クラス

匿名クラスはコードをより簡潔にすることができ、名前は必要なく、1 ステップで宣言とインスタンス化が可能です。

匿名クラスの宣言は、クラスを定義するコード ブロックが後に続くことを除けば、コンストラクターの呼び出しと同様の式です。

匿名クラスの定義の式には次の部分が含まれます:

新しいキーワード

匿名クラスが実装する必要がある言い訳、または継承された親クラスの名前

パラメータを含む括弧のペアWhen インターフェースを実装するには、パラメーター部分を空白のままにしておきます

匿名クラス本体は、クラス本体と同様に、メソッドを定義できます

匿名クラスには、ローカル クラスとして使用できる同じ型があります:

それが配置されているクラスのクラスメンバー

ローカル変数は、その変数が配置されているコードブロック内でfinal修飾子とともに使用することも、初期化後に割り当てられなくなったローカル変数(java8)も使用できます

難読化された型の場合、それらは名前で直接参照することはできません

同様に、匿名クラスは静的メンバーまたはインターフェイスを宣言できません。ただし、定数変数は宣言でき、匿名クラスのクラス本体、インスタンス フィールド、インスタンス メソッド、インスタンス初期化コード ブロック、およびローカルで宣言できます。クラスを宣言できます。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート