第三に、内部クラス
次の内部クラスとしてので、クラスは、クラス内の別のクラス内で定義されています。
①クラス内のメソッドは、プライベートデータを含め、どこのクラスの定義の範囲のデータにアクセスすることができます。
②内部クラスは同じパッケージの他のクラスのために非表示にすることができます。
③あなたはコールバック関数を定義したいと行うとより便利に匿名内部クラスを使用して、多くのコードを書きたくありません。
インナークラスは影響を及ぼさないため、各内部クラスは、独立して、特定のを達成するためにかかわらず、封入クラスは、(インターフェース)を継承しているかどうかの実装(インターフェース)を継承することができ
図1に示すように、アクセスにオブジェクト・クラスの内部状態を使用して
内部クラスは、データのみのフィールドを作成し、独自のデータフィールドにアクセスすることができ、また、その外側のクラスのオブジェクトにアクセスすることができます。
コンパイル時に、コンパイラが内部クラスのデフォルトコンストラクタを生成します、囲むクラスのパラメータの参照を追加します。
公共のB(A){
アウター=。
}
このクラスは、周辺、外であるだけで、クラス内のメカニズムを説明するためにそれを使用して、キーワードではありません。
図2に示すように、内部クラスベース(文法)
パブリッククラスOuterClass {
プライベート文字列名;
プライベートint型の年齢;
/ ** **オミットgetterメソッドとsetterメソッド/
パブリッククラスInnerClass {
パブリックInnerClass(){
名前=「chenssy」。
年齢= 23;
}
公共ボイドディスプレイ(){
System.out.println( "名:" +のgetName()+ ";年齢:" + getAge());
}
}
パブリック静的無効メイン(文字列[] args){
OuterClass outerClass =新しいOuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass()。
innerClass.display();
}
}
オブジェクトクラス内部リファレンスの型を指定する必要があります①
OuterClassName.InnerClassName
内部クラスのオブジェクトを作成するとき②
OuterClass.InnerClass innerClass = outerClass.new InnerClass()。
③外部のクラスオブジェクト、使用への参照を生成する必要OuterClassName.this
注:ドメインが最終でない場合は、各外部オブジェクトのために、それぞれが、クラスの内部インスタンスを持つことになり、それはおそらく唯一のものではないので、すべての内部の静的フィールドはクラス内で宣言、最終でなければなりません。
内部クラスは、静的メソッドを持つことはできません
内部コンパイラクラスは現象であり、関係なく、仮想マシンの、コンパイラが$別の従来の外部クラスファイルクラスと内部クラスと内部クラス名に変換します
以下のような:
クラスとクラスを囲むOuterClassはInnerClassの内部と呼ばれ、コンパイルが成功した後、その2つのクラスファイルが存在します:OuterClass.classとOuterClass $ InnerClass.class
内部クラスの3、メンバー
内部クラスのメンバーは、囲むクラスのメンバーであり、最も一般的な内部クラス、彼は無制限であることができるようにプライベートにもかかわらず、クラスの周辺部材にアクセスするためのすべてのプロパティとメソッドが、クラス内の囲みクラスのメンバプロパティへのアクセスですおよび方法は、アクセス可能な内部クラスのインスタンスであることを。
注:①内部クラスのメンバーは、任意の静的変数やメソッドを存在できない、②内部クラス接続されている周辺機器のカテゴリのメンバー、唯一の内部周辺クラスを作成するクラスを作成します。
パブリッククラスOuterClass {
プライベート文字列str;
ます。public void outerDisplay(){
System.out.println( "outerClass ...");
}
パブリッククラスInnerClass {
ます。public void innerDisplay(){
周辺内の//使用プロパティ
STR = "chenssy ..."。
System.out.println(STR)。
//周辺内で使用
outerDisplay();
}
}
/ *推奨のgetXXX()なしパラメータ場合は特に内部クラスのコンストラクタ、クラスの内側部材を取得します* /
公共InnerClass getInnerClass(){
新しいInnerClassを返します();
}
パブリック静的無効メイン(文字列[] args){
OuterClass外=新しいOuterClass()。
()内= outer.getInnerClass OuterClass.InnerClass; //内部クラス内のメソッドを呼び出すために、クラス内部オブジェクトを作成することができ
inner.innerDisplay();
}
}
図4に示すように、部分的な内部クラス
ローカルインナークラスは、このクラスを使用するための、方法および範囲内にネストされているが、主に、より複雑な問題を解決するために使用されている、当社のソリューションを支援するクラスを作成したい、私たちは、このクラスは、一般に公開されたくありませんローカル内部クラスとして、ローカルインナークラスを生成し、クラスは、内側部材をコンパイルされ、その範囲が変更され、それだけ失敗しメソッドとプロパティ、メソッドのプロパティで使用することができます。
これは、パブリックまたはプライベートの指定子で宣言することはできません。
①の方法でに定義され
パブリッククラスParcel5 {
公共Destionationのdestionation(文字列str){
クラスPDestionation実装Destionation {
プライベート文字列ラベル。
プライベートPDestionation(文字列whereTo){
ラベル= whereTo。
}
パブリック文字列readLabel(){
ラベルを返します。
}
}
新しいPDestionation(STR)を返します。
}
パブリック静的無効メイン(文字列[] args){
Parcel5 parcel5 =新しいParcel5();
Destionationさd = parcel5.destionation( "chenssy")。
}
}
②スコープで定義されています
パブリッククラスParcel6 {
プライベート無効internalTracking(ブールb)の{
IF(B){
クラスTrackingSlip {ローカル内部クラスの定義//
プライベート文字列ID;
TrackingSlip(文字列S){//コンストラクタ
ID = S。
}
ストリングgetSlip(){
IDを返します。
}
}
TrackingSlip TS =新TrackingSlip( "chenssy");
ストリングストリング= ts.getSlip()。
}
}
ます。public voidトラック(){
(真)internalTracking。
}
パブリック静的無効メイン(文字列[] args){
Parcel6 parcel6 =新しいParcel6();
parcel6.track();
}
}
5、匿名内部クラス
button2.addActionListener(
新規のActionListener(){
公共のボイドのactionPerformed(のActionEvent e)の{
System.out.println( "あなたはボタンを押すII");
}
});
①匿名内部クラスは、アクセス修飾子を持っていません
最初にあり②new匿名内部クラス
時間パラメータ場合は匿名内部クラスを使用している場合③、パラメータは、最終的に設定されます。
④匿名内部クラスにはコンストラクタがありません。
6、静的内部クラス
使用静的な修飾は、静的な内部クラスと呼ばれています。静的な内部クラスと非static内部クラスの最大の違いの間に、私たちは、翻訳が完了した後に、非静的な内部クラスを知っている暗黙のうちに、基準を保持しているだろう、それを作成囲むクラスにポイントが、静的な内部クラスが、いいえ。この引用手段なし:
①その作成が囲むクラスに依存しません
②これは、任意の非静的メンバ変数と包囲クラスのメソッドを使用することはできません。
③従来の内部クラス、静的フィールドおよびメソッドの静的内部クラスとは異なります。
④インタフェースのクラス宣言の内部で自動的に静的およびpublicのクラスとなります。
パブリッククラスOuterClass {
プライベート文字列のセックス。
公共の静的な文字列名=「chenssy」。
/ **
*静的な内部クラス
* /
静的クラスInnerClass1 {
/ * *静的メンバ静的な内部クラスがあるかもしれません/
公共の静的な文字列_name1 =「chenssy_static」。
公共ボイドディスプレイ(){
/ *
*静的な内部クラスのみアクセスでき、静的メンバ変数と囲むクラスのメソッド
*非静的メンバ変数やメソッドは、周辺のカテゴリにアクセスすることはできません
* /
System.out.println( "勝る名:" +名)。
}
}
/ **
*非static内部クラス
* /
クラスInnerClass2 {
/ *非静的な内部クラスは静的メンバーを持つことはできません* /
公共の文字列_name2 =「chenssy_inner」。
/ *非静的な内部クラスは、それが静的または非静的であるかどうか、囲むクラスの任意のメンバーを呼び出すことができます* /
公共ボイドディスプレイ(){
System.out.println( "OuterClass名:" +名)。
}
}
公共ボイドディスプレイ(){
/ *囲むクラスのアクセス静的インナークラス:内部クラス* /。
System.out.println(InnerClass1._name1)。
インスタンスを作成することができます/ *静的内部クラスは、末梢クラスに依存する必要はありません* /
新しいInnerClass1()表示()。
/ * / *クラスに依存する必要性の非静的内周部を作成します。
。OuterClass.InnerClass2 inner2 =新しいOuterClass()新しいInnerClass2();
/ *メンバーを有する非静的内部クラスは非static内部クラスの例を使用する必要があります* /
System.out.println(inner2._name2)。
inner2.display();
}
パブリック静的無効メイン(文字列[] args){
OuterClass外=新しいOuterClass()。
outer.display();
}
}