内部クラスとは?Static Nested ClassとInner Classの違い.

3146 ワード

Androidプログラマー面接宝典
内部クラスとは、1つのクラスの内部で定義されたクラスです.内部クラスでは静的メンバーを定義できません(静的メンバーはオブジェクトの特性ではなく、居場所を探すためにクラスに入れる必要があるだけです.これっぽっちのことで、クラスの内部のクラスに置くなんて、ひどいですね.内部クラスを提供するのは、あなたにそんなことをさせるためではなく、退屈で、やらせないためです.静的メンバーがc言語のグローバル変数に似ている以上、内部クラスは通常内部オブジェクトを作成するために使われているのではないかと思います.「グローバル変数」を内部クラスに置くことは意味のないことであり、意味のないことである以上禁止されるべきである)、内部クラスは外部クラスのメンバー変数に直接アクセスすることができ、内部クラスは外部クラスのメソッドの外に定義することもできるし、外部クラスのメソッド体に定義することもできる.
public class Outer
{
        int out_x  = 0;
        public void method()
        {
            Inner1 inner1 = new Inner1();
            public class Inner2   //            
            {
                public method()
                {
                    out_x = 3;
                }
            }
            Inner2 inner2 = new Inner2();
        }

        public class Inner1   //            
        {
        }
        
}

メソッドボディの外で定義された内部クラスのアクセスタイプはpublic、protecte、デフォルト、privateの4種類であり、クラスで定義されたメンバー変数に4種類のアクセスタイプがあるように、この内部クラスの定義が他のクラスに表示されるかどうかを決定します.この場合、外部で内部クラスのインスタンスオブジェクトを作成することもできます.内部クラスのインスタンスオブジェクトを作成する場合は、必ず外部クラスのインスタンスオブジェクトを作成してから、この外部クラスのインスタンスオブジェクトを使用して内部クラスのインスタンスオブジェクトを作成します.コードは次のとおりです.
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();

メソッド内で定義された内部クラスの前にアクセスタイプ修飾子は、メソッドで定義されたローカル変数のように使用できませんが、finalまたはabstract修飾子を使用することができます.この内部クラスは、他のクラスに対して非表示の他のクラスでは参照できませんが、この内部クラスで作成されたインスタンスオブジェクトは、他のクラスへのアクセスを渡すことができます.このような内部クラスは、まず定義され、後で使用されなければならない.すなわち、内部クラスの定義コードは、そのクラスを使用する前に表示されなければならない.これは、メソッドのローカル変数が先に定義され、使用されなければならない道理と同じである.この内部クラスはメソッドボディのローカル変数にアクセスできますが、このローカル変数の前にfinal修飾子を付ける必要があります.これらの詳細については、eclipseでコードを書いてみるだけで、開発ツールが提示したさまざまなエラー情報に基づいてすぐに知ることができます.
メソッドボディの内部には、インタフェースまたはクラスのサブクラスを定義すると同時に、サブクラスのインスタンスオブジェクトも作成できます.サブクラスの名前を定義する必要はありません.
public class Outer
{
        public void start()
        {
            new Thread(
new Runable(){
                    public void run(){};
}
).start();
        }
}


最後に、メソッドの外部定義の内部クラスの前にstaticキーワードを付けることで、Static Nested Classとなり、内部クラスの特性はなくなり、すべて、狭義には内部クラスではありません.Static Nested Classは、通常クラスと実行時の動作や機能に違いはありませんが、プログラミングリファレンス時の構文にはいくつかの違いがあり、public、protected、デフォルト、privateなど多くのタイプとして定義できますが、通常クラスはpublicと暗黙の2つのタイプとして定義できます.外部参照Static Nested Classクラスの名前は「外部クラス名.内部クラス名」です.外部クラスのインスタンスオブジェクトを作成する必要がなく、外部クラスのインスタンスオブジェクトを直接作成できます.たとえば、InnerがOuterクラスで定義されたStatic Nested Classであると仮定すると、次の文を使用してInnerクラスを作成できます.
Outer.Inner inner = new Outer.Inner();

static Nested Classは外部クラスのインスタンスオブジェクトに依存しないため、static Nested Classは外部クラスの非staticメンバー変数にアクセスできます.外部クラスでStatic Nested Classにアクセスする場合は、外部クラスの名前を付ける必要がなく、Static Nested Classの名前を直接使用することができ、Static Nested Classでは外部クラスのstaticのメンバー変数を直接参照することができ、外部クラスの名前を付ける必要はありません.
静的メソッドで定義される内部クラスもStatic Nested Classであり、この場合クラスの前にstaticキーを付けることはできません.静的メソッドのStatic Nested Classは、通常のメソッドの内部クラスの適用方法とよく似ています.外部クラスのstaticのメンバー変数に直接アクセスできるほか、静的メソッドのローカル変数にもアクセスできますが、このローカル変数の前にfinal修飾子を付ける必要があります.
備考:まず、あなたの印象に基づいて、内部クラスの全体的な特徴を説明します.例えば、2つの場所で定義することができ、外部クラスのメンバー変数にアクセスすることができ、静的メンバーを定義することができません.これは大きな特徴です.次に、いくつかの定義方法の文法の違い、静的内部クラス、匿名内部クラスなど、詳細な知識を話します.