Javaインナークラス、同様の概念もC ++、つまりネストされたクラスにも見られます。一見すると、内部クラスは少し冗長に見えるかもしれませんし、それらの有用性は初心者にとってそれほど重要ではないかもしれませんが、それを詳細に理解することで、Javaデザイナーは実際に内部クラスに意図されていることがわかります。内部クラスを使用することを学ぶことは、高度なJavaプログラミングをマスターすることの一部であり、プログラム構造をよりエレガントに設計できるようになります。以下は、次の側面から紹介されています。
最初の会議
パブリックインターフェイスコンテンツ{int値();}パブリックインターフェイス宛先{String readLabel();} public class goods {private classコンテンツはコンテンツを実装します{private int i = 11; public int value(){return i; }}保護されたクラスのgdestination実装宛先{private string label; private gdestination(string whereto){label = whereto; } public string readlabel(){return label; }}パブリックデスティネーションDest(String s){return new gdestination(s); } public contents content(){new content(); }} class testgoods {public static void main(string [] args){goods p = new Goods();内容c = p.cont();宛先D = p.dest( "Beijing"); }}この例では、クラスのコンテンツとgDestinationはクラスの商品内で定義されており、アクセスレベルを制御するためにそれぞれ保護されています。コンテンツは商品のコンテンツを表しますが、GDestinationは商品の目的地を表します。それぞれ2つのインターフェイスコンテンツと宛先を実装します。以下の主な方法では、コンテンツCと宛先Dを使用して直接操作すると、これら2つの内部クラスの名前さえ表示されません。このようにして、内部クラスの最初の利点は反映されています - 他の人に知ってほしくない、つまりカプセル化を望んでいない操作を隠すことです。
同時に、外部クラスの範囲外で内部クラスオブジェクトを取得する最初の方法、つまり外部クラスのメソッドを使用して作成および返す方法も発見しました。これは、上記の例のcont()およびdest()メソッドがどのように行うかです。それで、他の方法はありますか?もちろん、構文形式は次のとおりです。
Outerobject = new outourclass(Constructor Parameters); outerclass.innerclass innerobject = outerobject.new innerclass(constructorパラメーター);
非静的な内部クラスオブジェクトを作成する場合、最初に対応する外部クラスオブジェクトを作成する必要があることに注意してください。理由に関しては、それは私たちの次のトピックにもつながります -
非静的な内部クラスオブジェクトは、外側のクラスオブジェクトへの参照を持っています
ちょうど今の例を少し変更してください:
パブリッククラス商品{private verureate = 2;プライベートクラスのコンテンツはコンテンツを実装しています{private int i = 11*vualerate; public int value(){return i; }}保護されたクラスのgdestination実装宛先{private string label; private gdestination(string whereto){label = whereto; } public string readlabel(){return label; }}パブリックデスティネーションDest(String s){return new gdestination(s); } public contents content(){new content(); }}修正された部分は赤で表示されます。ここでは、商品のクラスにプライベートメンバー変数のveriableateを追加します。これは、商品の値係数を意味します。内部クラスのコンテンツメソッド値()が値を計算すると、それを掛けます。 value()は、内部クラスの2番目の利点でもあるvalueateにアクセスできることがわかりました。内側のクラスオブジェクトは、プライベート変数を含めても、それを作成した外部クラスオブジェクトのコンテンツにアクセスできます。これは非常に便利な機能であり、設計時により多くのアイデアやショートカットを提供します。この関数を実装するには、内側のクラスオブジェクトに外側クラスオブジェクトを参照する必要があります。 Javaコンパイラが内部クラスオブジェクトを作成すると、外部クラスオブジェクトへの参照を暗黙的に渡し、常に保存します。これにより、内部クラスオブジェクトは常に外部クラスオブジェクトにアクセスできます。これが、外部クラスアクションの範囲外で、最初に外部クラスオブジェクトを作成する必要がある理由でもあります。
一部の人々は、内部クラスのメンバー変数が外側クラスのメンバー変数と同じである場合、つまり、外側クラスの同じ名前のメンバー変数がブロックされている場合はどうなりますか?大丈夫、Javaは次の形式を使用して外部クラスへの参照を表現します。
アウタークラス
それで、私たちはそのようなブロッキングの状況を恐れていません。
静的インナークラス
通常のクラスと同様に、内部クラスも静的です。ただし、非静的な内部クラスと比較して、違いは、静的な内部クラスには外部への参照がないことです。これは、実際にはC ++のネストされたクラスに非常に似ています。 Java内部クラスとC ++ネストされたクラスの最大の違いは、外部への参照があるかどうかです。もちろん、デザインの観点やその詳細とは違いがあります。
さらに、非静的な内部クラスでは、静的データ、静的メソッド、または別の静的インナークラスを存在することはできません(内側のクラスは複数のレイヤーをネストできます)。ただし、静的な内部クラスにはこれらすべてを持つことができます。これは、2つの2番目の違いでもあります。
ローカル内部クラス
はい、Java内部クラスはローカルである可能性があり、メソッドまたはコードブロック内で定義できます。
Public Class Goods1 {Public Destination Dest(String S){class gdestinationは宛先を実装しています{private string label; private gdestination(string whereto){label = whereto; } public string readlabel(){return label; }} new gdestination(s)を返します。 } public static void main(string [] args){goods1 g = new Goods1();宛先D = g.dest( "Beijing"); }}これは上記の例です。 Method Destでは、内部クラスを定義し、最後にこのメソッドはこの内部クラスのオブジェクトを返します。これは、そのオブジェクトのいずれかを作成し、内側のクラスを使用するときに外側に作成する必要がある場合に実行できます。もちろん、方法で定義されている内部クラスは、デザインを多様化することができ、目的はこの意味だけではありません。
これがより奇妙な例です:
public class goods2 {private void internal Tracking(boolean b){if(b){class trackingslip {private string id; TrackingSlip(string s){id = s; } string getSlip(){return id; }} TrackingSlip ts = new TrackingSlip( "Slip");文字列s = ts.getslip(); }} public void track(){internalTracking(true); } public static void main(string [] args){goods2 g = new Goods2(); g.track(); }}これはその範囲を超えているため、IF以外のこの内部クラスのオブジェクトを作成することはできません。ただし、コンパイル時には、インナークラストラッキングスリップは他のクラスと同時にコンパイルされますが、独自のスコープのためにこのスコープを超えると無効です。これとは別に、それは他の内部クラスと変わりません。
匿名の内部クラス
Javaの匿名の内部クラスの構文ルールは少し奇妙に見えますが、匿名の配列のように、クラスのオブジェクトを作成するだけで、その名前を使用できない場合、内部クラスを使用すると、コードを簡潔で明確にすることができます。その構文ルールは次のとおりです。
new interfaceName(){......};または新しいsuperclassname(){......};引き続き例を挙げましょう。
public class goods3 {public contents content(){return new contents(){private int i = 11; public int value(){return i; }}; }}ここで、このメソッドは、匿名の内側クラスを使用して、非常に簡潔に見えるインターフェイスコンテンツのクラスを実装するオブジェクトを直接返します。
Javaでのイベント処理用の匿名アダプターでは、匿名の内側クラスが広く使用されています。たとえば、ウィンドウを閉じたいときは、このコードを追加します。
frame.addwindowlistener(new windowadapter(){public void windowclosing(windowevent e){system.exit(0);}});注意すべきことの1つは、匿名のインナークラスには名前がないため、コンストラクターがないことです(ただし、この匿名の内部クラスが、引数を持つコンストラクターのみを含む親クラスを継承する場合、これらのパラメーターを作成するときにこれらのパラメーターを持ち込み、スーパーキーワードを使用して実装プロセス中に対応するコンテンツを呼び出す必要があります)。メンバー変数を初期化する場合は、いくつかの方法があります。
メソッドの匿名の内部クラスの場合、このメソッドを使用して必要なパラメーターを渡すことができますが、これらのパラメーターは最終的に宣言する必要があることを忘れないでください。
匿名の内部クラスを、コンストラクターを持つことができるように、名前付きのローカル内部クラスに改革します。
この匿名の内部クラスで初期化コードブロックを使用します。
なぜ内部クラスが必要なのですか?
Java内部クラスの利点は何ですか?なぜ内部クラスが必要なのですか?
まず、簡単な例を見てみましょう。インターフェイスを実装したいが、このインターフェイスの1つのメソッドが、想像したクラスの1つのメソッドと同じ名前とパラメーターを持っている場合、どうすればよいですか?現時点では、内部クラスを作成してこのインターフェイスを実装できます。内側のクラスには外側クラスのすべての内容にアクセスできるため、そうすることで、このインターフェイスを直接実装するすべての機能を達成できます。
しかし、あなたは質問しなければならないかもしれません、それは方法を変更するのに十分ではありませんか?
実際、これを内部カテゴリを設計する理由として使用することは本当に説得力がありません。
本当の理由は、Javaの内部クラスとインターフェイスを組み合わせて、C ++プログラマーがしばしば不平を言う問題を解決することです。これ以上の継承はありません。実際、C ++の多材料は設計に非常に複雑であり、Javaは内部クラスとインターフェイスを介した多材料の効果を達成できます。
Java内部クラスの概要
(1)メソッド間で定義されている非静的な内部クラス:
●周辺クラスと内部クラスは、互いに自分のプライベートメンバーにアクセスできます。
●静的メンバー変数は、内部クラスで定義できません。
外部クラスの範囲から、内部クラスオブジェクトを作成するには、最初に外部クラスオブジェクトを作成する必要があります
(2)メソッド間で定義された静的な内部クラス:
●外部クラスの静的メンバーのみにアクセスできます。
静的インナークラスには、外部への参照はありません
(3)メソッドで定義されているローカル内部クラス:
●この内部クラスにはアクセス制御権限がありません
●周辺クラスは、メソッドのローカル内部クラスを見ることができませんが、ローカル内部クラスは周辺クラスの任意のメンバーにアクセスできます。
●ローカル内部クラスにメソッド本体でアクセスできますが、アクセスステートメントはローカル内部クラスを定義した後でなければなりません。
●ローカル内部クラスは、メソッド本体の定数のみにアクセスできます。つまり、ファイナルで変更されたメンバーです。
(4)メソッドで定義されている匿名の内部クラス:
●コンストラクターはなく、代わりにコンストラクターパラメーターをスーパークラスコンストラクターに渡す
クラスのオブジェクトを作成する必要があり、その名前を使用しない場合、匿名の内側クラスを使用すると、コードを簡潔で明確にすることができます。
上記の記事は、Javaの内部および匿名のクラスが私があなたと共有したすべてのコンテンツであることを包括的に理解しています。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。