それは事を勝つために内部のものが含まれています。別のクラスを含むクラスは、そのクラスの外に呼び出しを含むクラスのインテリアと呼ばれます。
たとえば、次のように身体と心の関係、自動車とエンジンとの間の関係。
ハート、有用であるだけで、エンジンと車体。内部クラス、あまりにも。
カテゴリー:
1.内部クラスのメンバー。
(匿名内部クラスを含む)2.ローカル内部クラス。
内部クラスの1メンバー
/ *
修飾子クラス{クラス名、外部
改質内部クラスのクラス名{
...
}
...
}
* /
publicクラスアウター{
プライベート文字列名;
publicクラス間{
公共ボイドInterMethod(){
System.out.println(「内部メソッド」)
のSystem.out.println(「名:」+名); //クラスは、クラスのプロパティの内部メンバーにアクセスすることができる
}
}
公共ボイドFUN1(){
新新しいインターインター=( );
in.InterMethod();
}
}
コンパイル後、クラスのクラスファイルがディスク上に保存されます
内部クラスを使用します
外部の新しいクラスオブジェクトで直接使用することができます。
他のクラスでのアクセス:
1.間接法:内部クラス外部クラスを使用する方法、クラスで使用される他のクラスは、外部のこの新しいメソッドを呼び出します。
/ ** *内部クラスの他の種類 * / パブリック クラスOuterDemo1 { 公共 静的 ボイドメイン(文字列[]引数){ 外側OUT = 新しい新しい外部(); out.fun1(); } }
2.直接的な方法は、直接内部クラスを作成します
式:外部内部クラス名name =外部オブジェクトのクラス名(の新しいクラス名).new内部クラス名();.
パブリック クラスOuterDemo2 { 公共 静的 ボイドメイン(文字列[]引数){ でOuter.Inter = 新しい外部()。新しいインテル(); in.InterMethod(); } }
質問:クラス外で、内部クラスは、内部クラスのメソッド本体は、同じ名前の属性、それをどのように出力に対応する値を表示されますか?
ソリューション:
{クラスOuterDemo3パブリック
プライベート文字列名= "外側";
クラス間{
プライベート文字列名= "内部";
ます。public void interMethod(){
文字列名= "方法";
System.out.printlnは(名前); //出力:メソッド、近接の原理
のSystem.out.println(this.name); //出力:
のSystem.out.println(OuterDemo3.this.name); //出力:外
}
}
}
2.ローカル内部クラス
クラス本体を定義するプロセスでは、この方法のうち、クラスが使用できない(それは} {ローカルインナークラスの他のタイプを使用することができません)
人気:
権限の修飾使用規則を:
公共>保護>(デフォルト)>プライベート
1.外部カテゴリ:機能の公共/(defautl)修正
内部クラスの2メンバー:publi /保護/(デフォルト)/私立
3.ローカル内部クラス:書き込みには何もありません
パブリッククラスのテスト{
公共ボイド楽しい(){
最終int型NUM = 100。
クラス楽しい{
プライベートのボイドfun2(){
System.out.printlnは(NUM);
}
}
楽しい楽しい=新しいファン();
fun.fun2();
}
}
ローカル変数は、最後の変更がなければならないのはなぜアクセス方法:質問?
理由(基本的にライフサイクルの問題):
1.ヒープメモリのうち、オブジェクトの内部新しいクラス。
2.ローカル変数は、メソッド、スタックメモリに従ってください。
3.方法がなくなった、とすぐにスタック、消失全体でローカル変数。
4.しかし、新しいオブジェクトのうち、ヒープ、ガベージコレクタのノウハウに存在し続けます。
5.そのため、保存するために一定のプールの使用を継続するためにメモリをコピーします。
3.匿名内部クラス(重要)
>インターフェイスのすべての抽象メソッドを書き換える - - >新しいインプリメンテーション・クラスの使用にいつものように、我々はインターフェイスメソッドを使用するには、最初に実装し、このインタフェースというクラスを定義する必要があります。
一度だけ除くインターフェース実装クラスならば、このような場合には] [定義されたクラスを達成するために省略し、代わりに、匿名の内部クラスを使用することができます
インターフェース
パブリック インターフェースMyInteface { ボイド方法(); }
] [匿名内部クラスを使用します
/ ** *フォーマット: *インタフェース名インタフェース名=新しいオブジェクト名(){ * //抽象書き換えすべてのメソッドカバー *を}; * / publicクラスAnonymityTest2 { 公共の静的な無効メイン(文字列[] args){ MyIntefaceマイ= MyInteface新しい新しい(){ @Override 公共ボイド方法(){ System.out.printlnは( "匿名の内部クラスメソッド"); } }; my.method(); } }
多くの人が最初に誤解を持っていることがあります。それは、匿名内部クラス[行う]ではないでしょうか?MyInteface私=新しいMyInteface()} ...}これは名前ではないでしょうか?
探し"新新MyInteface(){... };"分析:
1)作成される新しいオブジェクトに代わってアクション。
2)インタフェース名] [匿名の内部クラスは、インターフェイスを実装します。
すべての抽象メソッドのインターフェイスを再読み込み3){...}この匿名の内部クラスである[]コンテンツ、
それは確かに全く何の姓に名前を付けていない、裸ではありません。
MyInteface私=新しいMyIntefaceは()} ...}匿名クラスメソッドのオブジェクトを呼び出すすることがあり、私の名前の目的です。
PS:匿名内部クラス、匿名オブジェクト
1、匿名内部クラスは、[]愛の作成にのみだけ時間の使用であることを述べました。
あなたがオブジェクトの数倍が、コンテンツの同じ種類を作成したい場合は、実装クラス単独より便利を定義します。
パブリッククラスAnonymityTest2 { パブリック静的無効メイン(文字列[] args){ MyInteface MY1 =新しいMyInteface(){ @Override 公共ボイド方法(){ System.out.printlnは( "匿名内部类方法")。 } }。 my1.method(); MyInteface MY2 =新しいMyInteface(){ @Override 公共ボイド方法(){ System.out.printlnは( "匿名内部类方法")。 } }。 my2.method(); } }
2. [匿名]オブジェクトを表し、メソッドを呼び出すときのみだけ時間と呼ぶことができます。
あなたが同じオブジェクトを使用する場合は、繰り返し発呼者、または被験者から、名前を付けます。
MyInteface新しい新しい(){ @Override 公共ボイド法1(){ System.out.printlnは( "方法匿名の内部クラス1。"); } @Override 公共ボイド方法2(){ System.out.printlnは( "方法2つの匿名の内部クラス" ); } } .method1(); 新しい新しいMyInteface(){ @Override 公共ボイド法1(){ System.out.printlnは( "方法匿名の内部クラス1。"); } @Override 公共ボイド方法2(){ のSystem.out。 println( "匿名の内部クラス方法2"); } } .method2()。
3. [匿名内部クラスが省略されている] <実装クラス/サブクラス>
[匿名オブジェクトが省略された<オブジェクト名>
二人は同じものではありません。
{クラスAnonymityTest公共 のpublic static無効メイン(文字列[] args){ FUN1(); } プライベート静的ボイドFUN1(){ //スレッドに対して、これは匿名オブジェクトである[] のRunnableについて//、これはあります[ 】匿名の内部クラス 新しい新しいスレッド(Runnableを新しい新しい(){ @Override 公共ボイドRUN(){ } })を起動();. } }