一般的に使用するJava内部クラスには、一般的な内部クラス、ローカル内部クラス、匿名の内部クラス、静的な内部クラスの4つの形式があります。以下は、さまざまな内部クラスの特性を説明するために行ったテストです。
内部クラスの特性に関して、次のようにコードについて詳しく説明します。
/** Java内部クラステスト** InteroBJ反射結果:** private Int i* private interobj $ intera* public interobj()* public static void main(java.lang.string [])* private int geti()* public void p()* public void pi()* public void pp()publ pppp()*以下は、プライベート属性またはメソッドパッケージレベルにアクセスするためのコンパイラが自動的に生成された静的メソッド* static intアクセス$ 0(interobj)*/public class interobj {private int i = 8; private intera ia = null; public interobj(){ia = new intera();} private inti() p(){pi(); pp(); ppp(); pppp(); pppp();}/ * *一般的なクラスでは、「コートクラス」の任意のレベルでメソッドとプロパティにアクセスできます。ジャケットクラスは、「内部クラス」の任意のレベルでメソッドとプロパティにアクセスすることもできます。内側のクラスは、コートクラスオブジェクトへの参照を保持できるためです。 *内部クラスがアクセスする必要があるプライベートメソッドと属性の場合、コンパイラは *プライベートメソッドと属性に対応する「パッケージ」レベルの静的メソッドを自動的に生成します。これらの方法は、外部クラスオブジェクトを *パラメーターとして使用する必要があるため、「パッケージ」レベルの静的メソッドの外部クラスのプライベートメソッドと *属性にアクセスできます。 *同じ原則は、ジャケットクラスが内部クラスのプライベートメソッドとプロパティにアクセスするのと同じです。内部クラスがコンパイルされると、 *ジャケットクラスがアクセスする必要があるプライベートメソッドとプロパティに対応する「パッケージ」レベルの静的メソッドが生成されます。 * * Intera Intera Reflection Result: * Private int ia *以下は、内部クラスが保持しているコートクラスオブジェクトの参照です *最終$ 0 $ 0 *コンストラクターのパラメーターとしてコートクラスオブジェクトを使用します * interobj $ intera(interobj) * private void pa() pa1() * */class intera {private int ia = 9; private void pa(){system.out.println( "はintera.pa:ia ="+ia+"、interobj.i ="+geti()) ia = "+ia+"、interobj.i = "+geti();}}/ * *ローカル内部クラスはメソッド内でのみ表示され、他の機能は一般的な内部クラスと同じです。 *アクセスする必要があるローカル変数の場合、ローカルインナークラスはアウタークラスオブジェクトへの参照を保持してプロパティとメソッドにアクセスすることができますが、外部クラスメソッドのローカル変数にアクセスできないためです。すべてのコンパイラは、ローカルインナークラスでアクセスする必要があるローカル変数のコピーを「コピー」します(ただし、基本タイプのint、float、string *が変更されていないタイプのコピーはありません)。コピーされた変数値と外部メソッドの変数の値によって指された *オブジェクトが同じオブジェクトであることを確認するために、ローカルクラスで使用されるローカル変数を最終的に設定し、ローカル部分のコピーされた変数と外部メソッドの変数が同じオブジェクトにポイントするようにすることが必要です。変数 *を最終的に設定すると、変数が指すオブジェクトアドレスが変化することはありませんが、オブジェクトの内部プロパティを変更できないことのみが変更されません。 * * interbのリフレクション結果: * *プライベートInt ib *以下は、内側クラスが保持するコートクラスオブジェクトの参照 *最終neterobjこの$ 0 *以下は、内側クラスの外部テストのローカル変数テストオブジェクトのリファレンスコピー *プライベート最終テストVal $テスト *コートクラスオブジェクトを使用し、コートクラスオブジェクトを使用し、ローカル変数テストはコンストラクターのパラメータとしてパラメーターを使用します。プライベートプロパティまたはメソッドパッケージレベルにアクセスするための静的方法を自動的に生成します *静的ボイドアクセス$ 0(interobj $ 1 $ interb) "、(method)pi.s ="+s+"、test.t ="+test.gett());}} interb ib = new interb(); //これは、ローカル内部クラスによって参照されるテストテストの内部状態を変更します。 //結果がib.pb()と呼ばれる場合、出力は変更値100test.sett.sett(100); ib.pb();}/ * *「コートクラスオブジェクト」への参照を保持する必要がない場合に使用されます。 * * INTERC反射結果:(静的インナークラスには、コートクラスオブジェクトへの参照がありません) * private int ic * interc() * private void pc() */static class interc {private int ic = 6; private void pc(){system.out.println( "これはinterc.pc:ic ="+ic);}}} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *内部クラスの任意の権限にアクセスできます*/public void pp(){intera ia = new intera(); ia.pa(); ia.pa1(); interc ic = new interc(); //ローカル内部クラスはメソッド内でのみ表示されます。 *静的メソッドには、「コートクラス」を指すオブジェクトは、コートクラスオブジェクトで参照する必要がある内部クラスオブジェクトを構築するため、非静的な内部クラスを構築することはできません。 */public static void ppp(){// intera ia = new intera(); ib = new interb();}/ * *匿名内部クラステスト */public void pppp(){testinterface tif = new testinterface(){public void pppp(){system.out.println( "testinterface.noname");}}; tif.pppp();} ib = 7、(method)pi.s = 5、test.t = 100 *これはintera.pa:ia = 9、interobj.i = 8 *これはintera.pa1:ia = 9、interobj.i = 8 *これはinterc.pc:ic = 6 *これはintera.pa:ia = 9、interobj.i = 8 * *これはinterc.pc:ic = 6*testinterface.noname*/public static void main(string [] args){interobj io = new interobj(); io.p();}}/**内部クラスを作成するためのインターフェイス*/インターフェイスtestInterface {public void pppp();}/** cublic classeのテストのためのPrival classe*/ gett(){return t;} public void set(int t1){t = t1;}}別の例を共有させてください:
public class innerclass {static toy toy = new toy(){string name = "lao wu";@override public void jump(){system.out.println(name+"breaking out of the Earth"); go();}};/*innerクラス:クラス内で定義されたクラス*1。メンバー内部クラス: *1.1メンバー内部クラスは、外部クラスのプロパティに直接アクセスできます *1.2外部クラス名を介して外部クラスの現在のオブジェクトにアクセスできます。この方法 *メンバー内部クラスインスタンス化されたオブジェクト:外部クラス名。内部クラス名参照名=外部クラスオブジェクト。NEW内部クラス名(); *2。静的インナークラス*2.1外部クラスのメンバーリソースは、静的インナークラス内でアクセスできず、クラス名*静的インナークラスインスタンス化オブジェクト:外部クラス名を介して外部クラスの静的リソースにのみアクセスできます。内部クラス名参照名=新しい外部クラス名。内部クラス名(); *3。ローカルインナークラス:*3.1外部クラスのプロパティに直接アクセスすることもできます*3.2外部クラスの現在のオブジェクトにアクセスすることもできます*3.3ローカルインナークラスはメソッド内でのみアクセスでき、修飾子はデフォルト*4にのみアクセスできます。匿名のインナークラス:クラスの特定のサブクラスインスタンスが必要な場合、 * new class name(){ *上書き方法を使用してクラスが一時的に生成されます。 *}; *4.1匿名の内部クラスは外部メソッドのプロパティにアクセスし、このプロパティは匿名の内側クラスで追加された一定の新しい属性とメソッドに変換され、匿名の内側クラス内でのみ使用できます**/public static void main(string [] args [] args [] fers exer = new person( "lao chen"); personcuterter Person( "Jian Zihao"、18).New Computer( "Alien"); pc.rungame(); pc1.rungame(); person.computer1 PC11 = new Person.computer1( "Internet Cafe Computer"); pc11.rungame(); per.usecomputer(); string str = "lalala"; // str = "rokudu"; void rungame(){// todo auto-fenated method stubsystem.out.println(per.age+"year-hond"+per.name+"playing lalalala demasita"); system.out.println(str);}}}; com.rungame(); {system.out.println( "地球から壊れる"); }};*/toy.jump(); toy.jump(); // toy.go(); // system.out.println(toy。);}} class person {string name; int age; static int age1 = 18; static string name1 = "フルタイムエキスパート";パブリックパーソン(int name、int age = public boid = easer age; playgame(){system.out.println(name+"play game");} public class computer {string name; public computer(string name){super(); this.name = name;} public void rungame(){system.out.println(name+"run game"); system.out.out.println(age+"age+"+" static class Computer1 {string name; public computer1(string name){super(); this.name = name;} public void rungame(){system.out.println(name+"run game"); system.out.println(person.age1+""+person.name1+"pryingゲーム"); {super(); this.name = name;} public void rungame(){system.out.println(name+"run game"); system.out.println(persh.this.age+""+person.name+"playing game");}} computer com = new Computer( "); com.rungame(); com.rungame(); rungame();} public class toy {public void jump(){system.out.println( "Jump Toy");}}}要約します
上記は、この記事のJava内部テストコードのすべての詳細な説明です。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!