Java内部クラス
1。意味
Javaプログラミング言語では、プログラムはクラスから構築されています。クラスはクラス内で宣言することもでき、そのようなクラスの内部クラスを呼び出します。
2。関数
•より良いカプセル化を実装すると、通常のクラス(非インナークラス)のアクセス修飾子はプライベートまたは保護できないが、内部クラスはできないことがわかっています。内部クラスをプライベートと宣言すると、外側のクラスのみが内側のクラスにアクセスし、内側のクラスをうまく隠すことができます。
•内部クラスは、外部クラスの影響を受けることなく、他のクラスまたはインターフェイスを継承(拡張)または実装(実装)できます。
•内部クラスは、たとえプライベートで変更されていても、外部クラスのフィールドと方法に直接アクセスできます。それどころか、外部クラスは内部クラスのメンバーに直接アクセスすることはできません。
3。原則
内部クラスはコンパイル時間の概念です。コンパイル後、次のように2つの独立したクラスファイルが生成されます。
public class outer {private string outername = "outer";クラス内側{private string innername = "inner"; }}コンパイルされたファイルは次のとおりです。
編集後、outer.innerはouter $ inernに変更され、ピリオド(。)はドル記号($)に置き換えられます。
IV。分類
Java内部クラスは、メンバー内部クラス、ローカル内部クラス、匿名の内部クラス、および静的な内部クラスに分けることができます。
1)メンバーの内部クラス
メンバー内部クラスは、外部クラスのメンバーと見なすことができます。静的メンバーはメンバー内部クラスで宣言することはできませんが、静的な最終フィールドは例外です。クラスがロードされると、静的メンバーが最初に初期化されることがわかります。メンバーの内部クラスに静的メンバーがいる場合、外部クラスの前に内部クラスが生成されます。内側のクラスは外部クラスに役立ち、外部クラスが制御不能になる前に生成される内部クラスが機能します。メンバーインナークラスをインスタンス化する場合、メンバー内部クラスは外部クラスの現在のオブジェクトへの参照を保持し、外部クラスのメンバーに、たとえプライベートが変更されても、メンバー内のクラスで直接アクセスできます。
static java.lang.system.outをインポートします。 public class outer {private string outername = "outer"; //外部クラスは内部クラスのメンバーに直接アクセスできず、内側のクラスオブジェクトプライベートインナー= new Inner()をインスタンス化する必要があります。パブリッククラス内側{private string innername = "inner"; public void show(){out.println(outername); //外側クラスのメンバーに直接アクセスできます}} public void show(){out.println(inner.innername); inner.show(); } public static void main(string [] args){outer outer = new outer(); outer.show(); //内側のクラスをインスタンス化します。 inner.show(); }}実行結果:
内側
外側
外側
メンバー内部クラスの外部クラスオブジェクトへの参照は、この前の外部クラスの名前で構成されています。このフォームは呼ばれます
Limited-this、out.println(outername)およびout.println(outer.this.outername)は同等です。
2)ローカル内部クラス
ローカルインナークラスの使用は、基本的にメンバー内のクラスの使用と同じです。ローカルの内部クラスが、ローカル変数と同様に、外部クラスの方法で定義されており、外部クラスのメンバーではないということです。ローカルインナークラスはメソッドの外側でアクセスできませんが、そのインスタンスはメソッドから返すことができ、インスタンスはもはや参照されなくなるまで残ります。ローカル内部クラスは、配置されているメソッドのローカル変数、メソッドパラメーターなどにアクセスすることもできます。制限は、ローカル変数またはメソッドパラメーターに最終的に宣言された場合にのみアクセスできることです。
static java.lang.system.outをインポートします。 public class outer {private string outername = "outer"; public void show(final string str){//メソッドパラメーターは最終型クラス内側{public void print(){out.println(outername+str); }} inenter inenter = new Inner(); inner.print(); } public static void main(string [] args){outer outer = new outer(); outer.show( ":lalala"); }}実行結果:
外側:ラララ
3)匿名の内部クラス
匿名の内部クラスは、クラス名のないローカル内部クラスとして想像できます。匿名の内部クラスには、次の特性があります。
1。匿名の内部クラスにはコンストラクターがありません。匿名の内部クラスにはクラス名がないため、コンストラクターを宣言することはできません。
2。匿名の内部クラスは、インターフェイスを継承または実装する必要があります。 newに割り当てられたタイプは、匿名クラスのスーパータイプです。匿名のクラスには、表示される条項が拡張または実装されていないことも、修飾子を持つこともできません。
3.匿名の内部クラスは、メンバーの内部クラスやローカル内部クラスと同じであり、静的メンバーは宣言できません。
static java.lang.system.outをインポートします。 public class outer {private string outername = "outer"; public void show(final string str){new Inner(){//内部インターフェイスPublic void print(){out.println(outername+str); }} .print(); } public static void main(string [] args){outer outer = new outer(); outer.show( ":lalala"); }}インターフェイス内側{void print(); }実行結果:
外側:ラララ
4)静的内部クラス
いくつかの本でネストされたクラスとも呼ばれる静的インナークラスでは、静的修飾子を宣言するときに使用する必要があります。静的インナークラスは、最初の3つのインナークラスとは異なります。静的インナークラスは、外側クラスの現在のオブジェクトへの参照を保持していないため、外側クラスの非静的メンバーに静的インナークラスでアクセスできません。静的な内部クラスは外側のクラスに依存しないと言えます。
static java.lang.system.outをインポートします。 public class outer {private string outername = "outer"; private static int id = 123;プライベートインナー= new Inner(); public static class Inner {public void print1(){//out.println(outname);外部クラスの非静的メンバーにアクセスすることはできません。println(id); } public static void print2(){out.println(id); }} public void show(){inner.print1(); } public static void main(string [] args){outer outer = new outer(); outer.show(); outer.inner.print2(); //クラス名を介して静的インナークラスにターンアクセス}}