Javaの内部クラス

5681 ワード

Javaの内部クラス
    内部クラスと外部クラス
        他のクラスの内部を定義することを内部クラスと呼び、内部クラスを含むクラスを外部クラスと呼び、内部クラスは外部クラスのメンバーです.
    内部クラスの分類
        1.静的内部クラス:static修飾メンバー内部クラスは静的内部クラスです.
        2.非静的内部クラス:static修飾のないメンバー内部クラスは非静的内部クラスです.
    内部クラスの定義
        1.非静的内部クラス:Javaでは、非静的クラスで静的Field、静的メソッド、静的初期化ブロックを定義できません.
        2.静的内部クラス:静的Fieldを含んでもよいし、非静的Fieldを含んでもよい.
    内部クラスの権限
        1.非静的内部クラス(インスタンスFieldに属する)
            ⑴.非静的内部クラスの外部クラスに対する権限
                非静的内部クラスは、インスタンスFieldに属しているため、外部クラスのField(privateのFieldを含む)に直接アクセスできます.
            ⑴.外部クラスの非静的内部クラスに対する権限
                インスタンスFieldに属しているため、非静的内部クラスオブジェクトを明示的に作成することで、非静的内部クラスのFieldにアクセスできます.
public class Outer{
    private int a = 3;                    //      Field
    
    public class Inner{
        private int b = 5;                //      Field
        
        public void acessOuter(){         //       Field  
            //                   Field,      Field
            System.out.println("    a :" + a);
        }
    }
    
    //      Field  
    public void acessInner(){ 
        //                           Field
        Inner in = new Inner();
        System.out.println("    b :" + in.b);
    }
    
    // main Outer  Field  ,          ,             Field
    public static void main(String[] args){
        Outer ou = new Outer();
        ou.acessInner(); //           Field           Field
    }
}

        2.静的内部クラス(クラスFieldに属する)
            ⑴.静的内部クラス外部クラスに対する権限
                外部クラスのインスタンスFieldにアクセスできません.privateのメンバーを含む外部クラスのクラスFieldにアクセスできるのは、クラスFieldに属しているためです.
            ⑴.外部クラスの静的内部クラスに対する権限
                外部クラスは静的内部クラスのFieldに直接アクセスできませんが、静的内部クラスのクラス名を呼び出し者として静的内部にアクセスできます.
                クラスのFieldは、静的内部クラスオブジェクトを呼び出し者として使用して静的内部クラスのインスタンスFieldにアクセスすることもできます.彼はクラスフィールドに属しているからだ
public class Outer{
    private        int a = 3;                    //       Field
    private static int b = 5;                    //      Field
    
    public static class s_Inner{
        private int c = 70;                      //      Field
        private static int d = 43;               //      Field
        
        //       Field  
        public void acessOuter(){
            //   ,                  Field
            // System.out.println("    a :" + a);
            
            //                 Field
            System.out.println("    b :" + b);
        }
        
        //      Field  
        public static void s_acessOuter(){
            //        Field               Field
	        //                     Field
	        Outer ou = new Outer();
            System.out.println("    a :" + ou.a);
	        //        Field             Field
            System.out.println("    b :" + b);
        }
    }
    
    //      Field  
    public void acessInner(){ 
        //      Field              Field
        //                       Field
        s_Inner in = new s_Inner();
        System.out.println("    c :" + in.c);
	
	    //       Field             Field
	    //                     Field   
	    System.out.println("    d :" + s_Inner.d);
    }
       
    // main Outer  Field  
    public static void main(String[] args){
        //      Field             Field
        //                     Field   
	    System.out.println("    d :" + s_Inner.d);
	
	    //     Field               Field
	    //                       Field
	    s_Innerin = new s_Inner();
	    System.out.println("    c :" + in.c);
    }
}

        3.外部クラス以外の内部クラスへのアクセス(静的内部クラスと非静的内部クラスを含む)
            ⑴. private修飾を用いた内部クラスは外部クラス以外にアクセスできない.
            ⑴. protected修飾を用いた内部クラスは,外部クラスと同じパッケージにある他のクラスと外部クラスのサブクラスにアクセスできる.
            (3).public修飾を用いた内部クラスは,どこでもアクセスできる.
            (4).アクセス制御子の内部クラスは省略し,外部クラスと同一のパッケージにある他のクラスにのみアクセスできる.
            (5).外部クラス以外の場所にアクセスするには,内部クラスの完全なクラス名を使用する必要がある.(例:パッケージ名.外部クラス名.内部クラス名)
    静的内部クラスと非静的内部クラスオブジェクトの作成
        1.非静的内部クラス
            非静的内部クラスは外部クラスインスタンスFieldに属するため、非静的内部クラスを作成するには外部クラスインスタンスを構築する必要があります.
Outer ou = new Outer();                //          
ou.Inner in = new Outer().new Inner(); //           

        2.静的内部クラス
            静的内部クラスはクラスFieldに属するので、クラス名を直接使用して静的内部クラスのコンストラクタを呼び出すことができます.
Outer.s_Inner in = new Outer.s_Inner();

    非静的内部クラスの継承
        非静的内部クラスのサブクラスを作成する場合は、サブクラスコンストラクタが非静的内部クラスのコンストラクタを呼び出すことを保証する必要があります.
public class innerSubClass extends Outer.Inner{
    public innerSubClass(){
        Outer.super();//                         ,super    Inner   
    } 
}

    ローカル内部クラス
        クラスをメソッドで定義すると、この内部クラスはローカル内部クラスであり、ローカル内部クラスはこのメソッドでのみ有効であり、ローカルクラスの
        アクセス範囲はこのメソッドでのみ使用できますので、アクセス制御子とstatic修飾は使用できません.
    匿名の内部クラス
        一度に使用するクラスを作成するのに適しています.
        匿名の内部クラス規則
            1.親を継承するか、インタフェースを実装する必要があります.
            2.親を継承するか、インタフェースを実装するしかありません.
            3.システムが匿名の内部クラスを作成すると、匿名の内部クラスオブジェクトがすぐに作成されるため、抽象クラスではありません.
            4.コンストラクタはクラス名がないため定義できませんが、内部でインスタンス初期化ブロックを定義できます.
            5.インタフェース内のいくつかの抽象的な方法を実現しなければならない.
            6.抽象的な親のすべての抽象的な方法を実現する必要があります.
    デザインから見る内部類
        1.クラス内の内部クラス
            クラスは物の抽象であるため、内部クラスは物中性子物の抽象であり、このサブ物体は外部と通信する必要はなく(好ましくは)、全体の物体のためだけに
            より良い協調作業ができるように存在します.
        2.ローカル内部クラス
            局所内部クラスは方法の中に存在し、方法は物の行為の抽象であり、自然局所内部クラスは行為を行う上で抽象的な部品が必要であることを体現している.
        3.匿名内部クラス
            ソフトウェア抽象化の過程で生じる使い捨てのために存在する.