Javaでは、クラスの定義を別のクラス内に配置できます。前者は内部クラスで、後者は外部クラスと呼ばれます
InnerClassは通常、クラスまたはステートメントブロックで外部クラスを参照するときに完全な名前を定義します
メンバーの内部クラスとローカルの内部クラス
-静的メンバーの内部クラス
-非静的メンバーの内部クラス
-匿名の内部クラス
静的内部クラスメンバー内部クラスローカル内部クラス
// 内部クラスと比較すると、これは外部クラスです public class OuterClass { public int a; int b; protected int c; private int d; static int e; public void memberMethod(){ System.out.println( "外部クラスのメンバーメソッド! " ); // メンバーの内部クラスはインスタンスを作成できます InnerClass innerClass = new InnerClass(); // 静的内部クラスはインスタンスを作成できます StaticInnerClass staticInnerClass = new StaticInnerClass(); } public static void staticMethod(){ System.out.println( "外部クラスの静的メソッド!" ); } // メンバーの内部クラスと静的な内部クラスはどちらも抽象または最終であり、4種類の権限でアクセスおよび変更できます // メンバー内部クラスは静的な存在 クラスを許可していませんInnerClass { // メンバーの内部クラスはすべてのアクセス許可を変更できます public int a; int b; protected int c; private int d; // メンバーの内部クラスは静的メソッドを書き込めません // static void staticMethod() {} // メンバーの内部クラスはメンバーメソッドを宣言でき ますvoid memberMethod(){ // メンバーの内部クラスは外部クラスのメンバーメソッドを呼び出すことができます OuterClassであった。この.memberMethod(); // 内部クラスを用いて呼び出すことができ、外側部材静的メソッドクラス OuterClass.staticMethod(); } // 部材内部クラスのコンストラクタは InnerClass(){} // のアクセス個々のフィールド 公共 ボイド checkField(int型A){ // のパラメータ A = 50 ; // この内部クラスのメンバー属性 この II.A = 100 ; // フィールドをクラス外 OuterClassであった。この II.A = 150 ; } } // 静的な内部クラス の静的 クラスStaticInnerClass { // 静的内部クラスはすべてのアクセス許可を装飾できます public int a; int b; protected int c; private int d; // 静的内部クラスはメンバーメソッドを宣言できます void memberMethod(){ // 外部クラスの静的メソッドを呼び出すことができます OuterClass.staticMethod(); // 外部クラスのメンバーメソッドに問題がある // OuterClass.this.memberMethod(); } // 静的内部クラスは静的メソッドを宣言できる static void staticMethod(){ // 外部クラス OuterClassの 静的メソッドを呼び出すことができる.staticMethod(); //外部クラスのメンバーメソッドが機能しない // OuterClass.this.memberMethod(); } public void fieldCheck(int a){ // 仮パラメーターフィールド a = 100 ; // 静的内部クラスフィールド this .a = 150 ; // 外部クラスフィールドは、静的メソッドと静的フィールドにのみアクセスできます OuterClass.e = 300 ; } // 静的内部クラスは、 StaticInnerClass() によっても構築できます(){} } public void classMethod(){ // ローカル内部クラスには、変更するアクセス権がありません。このメソッドで使用する場合、finalを設定してローカル内部クラスを変更 できます// 内部クラスによってアクセスされるローカル変数はFinalでなければなりません //このアプローチにおける生存のX範囲 // 場合メソッド呼び出しスタックの方法、即ち、破壊における変数xの端 最終 int型のx = 123 ; // ローカルインナークラス クラスLocalInnerClass { // が、ローカルインナークラスの静止例今のみ、x変数の参照ポイントを保持します // ローカルメソッドが破棄された後にこのメソッドを呼び出すと、x変数にアクセスできなくなります。これはバグの問題です // ただし、JDK8はデフォルトでx変数を暗黙的に表現しています最終的に変更された場合、xは一定の存在である必要があります // つまり、xが破棄されてもその値は変化せず、アクセスによって引き続き指定できる // 理由は、ローカル内部クラスのインスタンスのスコープがより大きいためですこの変数のスコープ public int returnX(){ // x + = 100; x変数は変更できません return x; } } } //ローカル内部クラスの使用法を使用して、インターフェースを実装するインスタンスを返すことができます Public Comparable getComparable(){ class LocalInnerClass implements Comparable { // ローカル内部クラスオーバーライドインターフェースメソッド @Override public int compareTo(Object o){ return 0 ; } } // 外部呼び出しに 戻るreturn new LocalInnerClass(); } }
静的内部クラスとメンバー内部クラスの外部インスタンスの作成とアクセス
public class ClassTest { public static void main(String [] args){ // 静的内部クラスをインスタンス化します OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass(); // 静的内部クラスのメンバーメソッド staticInnerClass.memberMethod(); // 静的内部クラスの静的メソッド OuterClass.StaticInnerClass.staticMethod(); // インスタント メンバーの内部クラス、 OuterClass outerClass = new OuterClass(); // 最初に外部インスタンスを作成 OuterClass.InnerClass innerClass = 。OuterClass 新しい新 InnerClass(); //内部初期化に、外部コールの例 //が 直接匿名外部物体であってもよいし、内部初期化クラスを呼び出す OuterClass.InnerClass innerClass2 = 新しい新しい OuterClass(た)。新規新しいInnerClass(); @ クラスのメンバインナ部材メソッド呼び出し innerClass.memberMethodを(); } }
匿名の内部クラス
public class ClassTest { public static void main(String [] args){ AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass(){ // これは、名前が示すように、匿名内部クラスanonymousのクラス本体です。クラス名がない ため、// インターフェイスを書き換えるメソッド はありません @オーバーライド public void aicMethod(){ System.out.println( "This is an anonymous inner class" ); } // 匿名の内部クラスは今回のみ宣言でき、表示されたクラスのように保存することはできません //の作成に使用されますインタフェースは、抽象クラスを継承するか、またはクラスは、一般的な継承できる // Runnableをマルチスレッドなど、インターフェイスメソッドを実装するためにのみ適用されます //スレッドにはCallableもあることに注意してください }; } } // インターフェイスと抽象メソッド インターフェイスを宣言しますAnonymousInnerClass { void aicMethod(); }