JAvaベース-内部クラスのインスタンス内部クラス1

3530 ワード

1内部クラス
内部クラスは、メンバー内部クラス、ローカル内部クラス、メンバー内部クラスに分けられ、静的および非静的の内部クラスに分けられます.
2内部クラスは外部と重複できません.
3インスタンス内部クラスの特徴:
  (1)内部クラスのインスタンスを作成する場合、外部クラスのインスタンスが存在する必要があります.
  (2)インスタンス内部クラスは外部クラスの参照を自動的に持つ.内部では、外部クラスのすべてのメンバーメソッドとメンバー変数に直接アクセスできます.
  (3)複数の内部クラスネストでは、内部クラスはすべての外部内のメンバー属性とメソッドにアクセスできます.
class Outer {
    private String name="outer";
    public int num=10;
    //      
    public class InnerTool {
       //            PI
       public static final float PI=3.1415f;
       private int num=20;

       public int add(int a, int b) {
           System.out.println("            ,name="+name);
           System.out.println("         num="+this.num);
           System.out.println(Outer.this.num);
           return a + b;
       }
    }
    //          
    private InnerTool innerTool = new InnerTool();
    public int area(int h,int w)
    {
       //  PI  
       return (int) (h*w*InnerTool.PI);
    }
    public int add(int a, int b) {
       return this.innerTool.add(a, b);
    }
}

class OuterA {
    public int a1;//  
    private int a2;//  
    static int a3;//  

    public OuterA(int a1, int a2) {
       this.a1 = a1;
       this.a2 = a2;
    }
    protected int methodA() {
       return (int) (a1 * a2*InnerB.PI);
    }

    class InnerB {
       //              
       static final float PI=3.14f;
       int b1 = a1;
       int b2 = a2;
       int b3 = a3;
       int b4 = new OuterA(3, 4).a1;
       int b5 = methodA();
       protected class InnerC
       {
           // static int cc=0; //               
           final static String name="InnerC";//         
           private void methodC()
           {
              methodA();//      
           }
       }
    }
}

public class TestInner2 {
    public static void main(String[] args) {
       OuterA.InnerB ib =new OuterA(2,3).new InnerB();
       System.out.println("    :"+OuterA.InnerB.PI);
       System.out.println("    :"+OuterA.InnerB.InnerC.name);
       System.out.println("ib.b1="+ib.b1);
       System.out.println("ib.b2="+ib.b2);
    }
}
 
(4)外部クラスインスタンスと内部クラスインスタンスの間には1対多の関係があり、1つの内部クラスは1つの外部クラスインスタンスのみを参照し、
一方、1つの外部クラスインスタンスは、0つ以上の内部インスタンスに対応します.外部クラスでは内部クラスのメンバーに直接アクセスすることはできません.内部クラスのインスタンスからアクセスする必要があります.
package innerclass;
import innerclass.A.B.C;
class A {
    static int C=0;
    class B {
       private int b1=1;
       private int b2=2;
       class C
       {
       }
    }
    public void test()
    {
       //int v1=b1;//      Inner Class      
       //int v2=b2;//      Inner Class      
       //B.C c1=new C();//       B     C
       B b =new B();
       int b1 =b.b1;
       int b2=b.b2;

       C c = b.new C();

       C c2= new B().new C();
    }
}
 
以上のクラスBにはクラスCクラスAが直接メソッドできないクラスCがクラスBを介してクラスCにアクセスすべきである.
(5)インスタンス内部クラスでは静的メンバー変数を定義できず、定数を定義できます.インスタンスメンバーを定義できます.
(6)インスタンスの内部クラスBと外部に同名の属性vが含まれている場合、クラスBではthis.vはBのメンバーを表し、
A.this.vはクラスAのメンバーを表す.