JAvaベース-内部クラスのインスタンス内部クラス1
3530 ワード
1内部クラス
内部クラスは、メンバー内部クラス、ローカル内部クラス、メンバー内部クラスに分けられ、静的および非静的の内部クラスに分けられます.
2内部クラスは外部と重複できません.
3インスタンス内部クラスの特徴:
(1)内部クラスのインスタンスを作成する場合、外部クラスのインスタンスが存在する必要があります.
(2)インスタンス内部クラスは外部クラスの参照を自動的に持つ.内部では、外部クラスのすべてのメンバーメソッドとメンバー変数に直接アクセスできます.
(3)複数の内部クラスネストでは、内部クラスはすべての外部内のメンバー属性とメソッドにアクセスできます.
(4)外部クラスインスタンスと内部クラスインスタンスの間には1対多の関係があり、1つの内部クラスは1つの外部クラスインスタンスのみを参照し、
一方、1つの外部クラスインスタンスは、0つ以上の内部インスタンスに対応します.外部クラスでは内部クラスのメンバーに直接アクセスすることはできません.内部クラスのインスタンスからアクセスする必要があります.
以上のクラスBにはクラスCクラスAが直接メソッドできないクラスCがクラスBを介してクラスCにアクセスすべきである.
(5)インスタンス内部クラスでは静的メンバー変数を定義できず、定数を定義できます.インスタンスメンバーを定義できます.
(6)インスタンスの内部クラスBと外部に同名の属性vが含まれている場合、クラスBではthis.vはBのメンバーを表し、
A.this.vはクラスAのメンバーを表す.
内部クラスは、メンバー内部クラス、ローカル内部クラス、メンバー内部クラスに分けられ、静的および非静的の内部クラスに分けられます.
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のメンバーを表す.