内部クラスの分類
Javaでは、内部クラスは主にメンバー内部クラス(非静的内部クラス、静的内部クラス)、匿名内部クラス、およびローカル内部クラスに分けられます。
メンバー内部クラス(private、default、protected、publicを使用して任意に変更できます。クラスファイル:外部クラス$内部クラス。クラス)
a)非静的内部クラス(外部クラスで非静的内部クラスを使用することは、通常の時間に他のクラスを使用することと同じです)
- 非静的内部クラスは、外部クラスオブジェクトに登録する必要があります。したがって、非静的な内部クラスオブジェクトがある場合、対応する外部クラスオブジェクトが存在する必要があります。非静的内部クラスオブジェクトは、外部クラスのオブジェクトにのみ属します。
- 非静的内部クラスは外部クラスのメンバーに直接アクセスできますが、外部クラスは非静的内部クラスのメンバーに直接アクセスできません。
- 非静的内部クラスは、静的メソッド、静的プロパティ、および静的初期化ブロックを持つことはできません。
- 外部クラスの静的メソッドと静的コードは、変数を定義してインスタンスを作成するための非静的内部クラスを含む、非静的内部クラスにアクセスできません。
- メンバー変数アクセスの要点:
- 内部クラスのメソッドのローカル変数:変数名。
- 内部クラス属性:this。変数名。
- 外部クラス属性:外部クラス名。this。変数名。
クラス アウター{
private int age = 10 ;
クラス インナー{
int 年齢= 20 ;
public void show(){
int 年齢= 30 ;
System.out.println("内部クラスメソッドのローカル変数age:" + age); // 30
System.out.println("内部クラスメンバー変数age:" + this .age); // 20
System.out.println(「外部クラスのメンバ変数の年齢:」 。+外この.age); // 10
}
}
}
6.内部クラスへのアクセス:
- 外側のクラスで内側のクラスを定義します。
新しいInner()
- 外部クラスの外部で非静的内部クラスを使用します。
Outer.Inner varnume = new Out()。new Inner()
例:
パブリック クラス TestInnerClass {
public static void main(String [] args){
//最初に外部クラスインスタンスを作成し、次に外部クラスインスタンスを使用して内部クラスインスタンスを作成します
Outer.Inner inner = new Outer()。new Inner();
inner.show();
アウターアウター= new Outer();
Outer.Inner inn =アウター。new Inner();
inn.show();
}
}
b)静的内部クラス
- 定義方法:
静的クラスClassName {
//クラス本体
}
- 使用ポイント:
- 静的内部クラスオブジェクトが存在する場合、対応する外部クラスオブジェクトは必ずしも存在するとは限りません。したがって、静的内部クラスのインスタンスメソッドは、外部クラスのインスタンスメソッドに直接アクセスできません。
- 静的内部クラスは、外部クラスの静的メンバーと見なされます。したがって、外部クラスのメソッドは、「静的内部クラス。名前」を使用して静的内部クラスの静的メンバーにアクセスし、新しい静的内部クラス()を介して静的内部クラスのインスタンスにアクセスできます。
クラス アウター{
//外部クラスの静的メンバーと同等
静的 クラス Inner {
}
}
パブリック クラス TestStaticInnerClass {
public static void main(String [] args){
//新しい外部クラス名を使用して内部クラスオブジェクトを作成します。内部クラス名()
Outer.Inner inner = new Outer.Inner();
}
}
匿名の内部クラス
一度だけ使用する必要があるクラスに適しています。
文法
新しい 親クラスコンストラクター(実際のパラメータークラスリスト)\ implementationインターフェイス(){
//匿名の内部クラス本体!
}
匿名内部クラスの使用
this .addWindowListener( new WindowAdapter(){
@オーバーライド
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
this .addKeyListener( new KeyAdapter(){
@オーバーライド
public void keyPressed(KeyEvent e){
myTank.keyPressed(e);
}
@オーバーライド
public void keyReleased(KeyEvent e){
myTank.keyReleased(e);
}
}
);
注意
- 匿名内部クラスにはアクセス修飾子がありません。
- 匿名の内部クラスには名前さえないため、コンストラクターはありません。
ローカルの匿名内部クラス
メソッドiで定義されている内部クラスもあり、スコープはローカル内部クラスと呼ばれるこのメソッドに制限されています。
ローカル内部クラスの使用は、主に複雑な問題を解決するために使用されます。解決を支援するクラスを作成したいと思います。そのとき、このクラスを公開したくないので、ローカル内部クラスを作成します。ローカル内部クラスはメンバー内部クラスと同じようにコンパイルされますが、スコープが変更され、このメソッドでのみ使用でき、邪魔にならない場合はメソッドが失敗します。
パブリック クラス Test2 {
public void show(){
//スコープはこのメソッドに制限されます
クラス インナー{
public void fun(){
System.out.println("helloworld");
}
}
new Inner()。fun();
}
public static void main(String [] args){
新しい Test2()。show();
}
}