Javaの内部クラス|これまでのところ、クラスのメンバーは変数、メソッド、コンストラクタ、および初期化子ブロックであることがわかっていました。
しかし、クラスまたはインターフェイスをクラスのメンバーとして持つこともできます。
別のクラス内で宣言されたクラスは、javaではネストされたクラスと呼ばれます。 ネストされたクラスのスコープは、その外側のクラス(外側のクラス)のスコープによって結び付けられます。
したがって、クラスBがクラスA内で定義されている場合、クラスBはクラスAなしで独立して存在することはできません。
javaのネストされたクラスは、それを囲むクラスのメンバー(プライベートメンバーを含む)にアクセスできます。 ただし、外側のクラスは、ネストされたクラスのメンバーにアクセスできません。
別のクラスのメンバーであるクラスは、静的または非静的のいずれかにすることができます。 つまり、javaには静的クラスと非静的クラスの2種類のネストされたクラスがあります。
静的修飾子で宣言されたメンバークラスは、javaでは静的ネストされたクラスと呼ばれます。
非静的なメンバークラスは、内部クラスまたは非静的ネストされたクラスとして知られています。 これは、ネストされたクラスの最も重要なタイプです。
このチュートリアルでは、Javaの内部クラスのみを学習します。 後で、静的ネストされたクラスについては、さらにチュートリアルで説明します。
Javaの内部クラス
javaの内部クラスは、静的修飾子なしで別のクラスの内部で宣言されたクラスです。 これは、Javaでは非静的ネストクラスとしても一般に知られています。 外部クラスのすべてのメンバー(変数とメソッド)にアクセスできます。
内部クラスは、静的メンバーの種類を持つことはできません。 Java内部クラスのメンバーは次のようになります:
- インスタンス変数
- インスタンスメソッド
- コンストラクタ
- 初期化ブロック
- 内部クラス
内部クラスの構文
access modifier class OuterClassName { . . . . . . . . . . access modifier class InnerClassName { // Members of the inner class. } // Other members of the outer class.}For example:public class Test { // Here, Test is an outer class. . . . . . . // Inner class public class A { // A is inner class as a member of its outer class. . . . . } }
内部クラスを保持するクラスは、enclosingまたはouter classと呼ばれます。 外側のクラスはトップレベルのクラスですが、内側のクラスは外側のクラスのメンバーです。
外部クラスと内部クラスの関係は、Has-A関係を表します。 Has-Aリレーションシップは、2つのクラス間のリレーションシップを確立します。 これは、Javaでは合成または集約とも呼ばれます。
内部クラスが別の内部クラスの囲むクラスである場合、それは内部クラスのネストと呼ばれます。 内部クラスのネストに制限はありません。
どのバージョンの内部クラスがJavaで導入されましたか?
内部クラスは、クラスファイルの処理に使用されるJVMに変更を加えずに、Java1.1バージョンで導入されました。 これは完全にJavaコンパイラの助けを借りて実装されています。
Javaコンパイラは、Outer$Innerという名前の内部クラスごとに個別のドットクラスファイルを生成します。クラスとOuterという名前の外部クラスの場合。クラス。 たとえば、内部クラスAはTest$という名前のクラスTestにコンパイルされますA.class…..
いずれかのドットクラスファイル名に中央に”$”記号が含まれている場合は、内部クラスファイルを表示します。 内部クラスのクラスファイルの形式は、外部クラスのクラスファイルと同じです。
したがって、JVMは内部クラスと外部クラスのクラスファイルを同じように扱います。
内部クラスの特徴
内部クラスにはいくつかの重要な特徴があります。
1. 内部クラスは、外部クラスと同じ名前を持つことができます。
2. 内部クラスのスコープは、その外部クラスのスコープによって制限されます。
3. 外部クラスオブジェクトまたはインスタンスが存在しないと、既存の内部クラスオブジェクトが存在する可能性はありません。
4. 内部クラスは、privateを含む外部クラスのすべての変数とメソッドに直接アクセスできます。
5. 内部クラスは、クラス内で宣言された変数やメソッドと同じように、外部クラスの正規メンバーであるためです。
そのため、public、default、protected、privateなどのすべてのjavaアクセス修飾子を、クラスの他のメンバーと同様に内部クラスに適用できます。 しかし、外側のクラスまたは通常のクラスはprivateまたはprotectedすることはできません。
6. 内部クラスの変数名が外部クラスの変数名と同じ場合、次のように外部クラス変数にアクセスできます。 アウトクラス名。これ。VariableName;ここでは、これは現在の外部クラスオブジェクトを表します。
7. Java内部クラスは、その外側のクラスの別のクラスから隠されています。 そのため、アプリケーションプログラムに安全機構を提供し、プログラムの可読性(理解性)を低下させる。
8. 内部クラスのオブジェクトは、多くの場合、その外部クラスで作成され、他のクラスから作成することはできません。
9. 外部クラスオブジェクトと内部クラスオブジェクトの両方が別々のメモリ位置に作成されます。
Javaで内部クラスのオブジェクトを作成する構文
内部クラスのインスタンスは、外部クラスのインスタンスと関係を共有します。 この関係は、外部クラスのインスタンスを持たずに内部クラスのインスタンスを作成することができないようなものです。
したがって、内部クラスのオブジェクトを作成するには、最初に内部クラスに関連付ける外部クラスのオブジェクトを作成する必要があります。 外部クラスの同じインスタンスに対して、内部クラスの複数のオブジェクトを作成できます。
内部クラスのオブジェクトを作成する構文は次のとおりです:
Syntax: OuterClass.InnerClass innerObject = outerObject.new InnerClass();For example:// First create an object of Outer class Test. Test t = new Test();// Second create an object of inner class A. Test.A innerObj = t.new A();
内部クラスのインスタンスが外部クラスのインスタンスとどのように関係を共有するかをリアルタイムの例で理解しましょう。
内部クラス
のリアルタイムの例1。 大学があるとします。 大学は電子工学、計算機科学、電気、機械、等のような複数の部門を含んでいます。
明日、政府は大学で起こっている違法行為のためにこの大学を閉鎖することを決定したと仮定します。 大学が閉鎖されている場合は、この大学のすべての部門が自動的に閉鎖されます。
だから学部は大学に縛られていると言えるでしょう。 すなわち、それらの機能はその大学と結びついている。 したがって、既存の大学オブジェクトがなければ、既存のdepartmentオブジェクトの可能性はありません。
学部は常に大学のクラスの一部であるため。 したがって、私たちは大学のクラスの中でdepartmentクラスを宣言しなければなりません。
class University { // University is outer class. . . . . . . . class Department { // Department is inner class. . . . . . . . . }}
したがって、あるタイプのオブジェクトが存在しない場合、別のタイプのオブジェクトが存在する可能性がない場合は、内部クラスを実装する必
2. 車があると仮定します。 車の中には、必要とされるいくつかの重要な個々のコンポーネントがあります。 車の最も重要な要素はエンジンです。
車を作るにはエンジンが必要です。 しかし、既存のcarオブジェクトがなければ、engineオブジェクトが存在する可能性もありません。
エンジンは常に車の重要な部分ですから。 したがって、クラスエンジンはクラスcar内で宣言する必要があります。
class Car { . . . . . . . . . class Engine { . . . . . . . . . . }}
上記の二つのリアルタイムの例は、内部クラスの基本的なアイデアを得るために説明されています。 次に、Java APIに基づいた次の例を取り上げます。
3. 私たちが知っているように、Javaではcollections APIにマップの概念があります。 マップは、キーと値のペアのグループに過ぎません。 各キーと値のペアは、1つのエントリと呼ばれます。 既存のmapオブジェクトがなければ、既存のentryオブジェクトの可能性はありますか?
マップのオブジェクトが存在しないと、エントリオブジェクトも存在できないため、答えはノーです。 そのため、インターフェイスエントリはmapインターフェイス内で定義されています。
Interface Map { // Map is an outer interface. . . . . . . . . . Interface Entry { // Entry is an inner interface. . . . . . . . . . . } }
これで、上記のリアルタイムの例から、Whenはjavaプログラミングで内部クラスを使用する必要があることを理解していたでしょう。
Javaでの内部クラスの使用
Javaでの内部クラスの次の重要な用途があります。
1. 内部クラスは、論理的に一緒に属するクラスとインターフェイスを一つの場所にグループ化することができるため、貴重な機能です。
2. これは、より読みやすく保守しやすいように、一方の他方の可視性を制御するのに役立ちます。
3. Java内部クラスの最適な使用方法は、その機能が外部クラスに関連付けられている場合です。 つまり、既存の外部クラスオブジェクトがなければ、既存の内部クラスオブジェクトが存在する可能性はありません。 リアルタイムの例を理解する。
4. . Java内部クラスは、重要なコードのセキュリティを提供するのに便利です。 たとえば、内部クラスをprivateとして宣言した場合、他のクラスでは使用できません。 これは、内部クラスへのオブジェクトを他のクラスで作成できないことを意味します。
リアルタイムのサンプルプログラムの助けを借りてそれを理解しましょう。
クラスBankAcctを作成すると仮定します。 いくつかの銀行口座の詳細を取得するために、クラスのインスタンス変数’balance’と’rate’を定義します。
calInterest()メソッドは利息金額を計算し、残高金額を表示します。 次のソースコードを見てください。BankAcctクラスの前にアクセス修飾子を使用していないため、このコードにセキュリティがないことを確認しています。
これはデフォルトのアクセス修飾子の下にあるため、プログラマはこのクラスのオブジェクトを簡単に作成し、他のクラスの外部からクラスのメン したがって、BankAcctクラスのセキュリティはありません。
たとえば、任意のプログラマは別のクラスを作成できます。 彼はBankAcctクラスのインスタンスを作成し、次のように利子率を変更することができます:
class Myclass { public static void main(String args ){ BankAcct ba = new BankAcct(); ba.calInterest(11.5); } }
したがって、calInterest()メソッドは非常に敏感です。 残高口座は他の人が外部から更新することができるため、外部から保護する必要があります。 承認された人だけが残高勘定を更新できるはずです。
calInterest()メソッドと利子率にセキュリティを提供するために、calInterest()メソッドのコードを内部クラス内に配置してプライベートにすると、誰も外部クラスからアク コードを見てここで問題は内部クラスにアクセスする方法ですか?
内部クラスにアクセスするには、外部クラス内にcontact()メソッドを作成します。 Contact()メソッドの内部では、内部クラスのオブジェクトを作成し、そのメンバーにアクセスできます。
認証銀行の人は、contact()メソッドを呼び出すことによって内部クラスと対話できます。 Contact()メソッドが呼び出されると、パスワードで検証され、内部クラスを使用してアクセスできるようになります。
したがって、内部クラスはJavaの重要なコードに安全メカニズムを提供することができます。
Javaの内部クラスのタイプ
宣言と動作に基づいて、Javaには基本的に4つのタイプの内部クラスがあります。 それらは次のとおりです:
- 通常または通常の内部クラス
- メソッドローカル内部クラス
- 匿名内部クラス
- 静的ネストされた内部クラス
このチュートリアルでは、それぞれを簡単に理解します。
1. 通常または通常の内部クラス:静的修飾子なしで別のクラスの内部およびメソッドの外部に作成されたクラスは、通常または通常の内部クラスと
2. メソッドローカル内部クラス:外部クラスのメソッド内で宣言されたクラスは、メソッドローカル内部クラスと呼ばれます。
3. 匿名の内部クラス: 名前なしで宣言されたクラスは、匿名の内部クラスと呼ばれます。
4. 静的ネストされた内部クラス:クラス内でstatic修飾子を使用して宣言されたクラスは、静的ネストされた内部クラスと呼ばれます。 トップレベルのネストされたクラスとも呼ばれます。 外部クラスの静的メンバーのみにアクセスできます。
注:通常の内部クラス、メソッドローカルクラス、および匿名の内部クラスは、非静的ネストされたクラスです。
内部クラスの利点
javaの内部クラスには基本的に5つの利点があります。 彼らは次のとおりです:
1。 内部クラスは、論理的に一緒に属する一つの場所にクラスとインターフェイスをグループ化する方法を提供します。
2. Privateを含む外部クラスのすべての変数とメソッドに直接アクセスできます。
3. これは、より読みやすく保守しやすいコードを開発するために使用されます。
4. 書くのに必要なコードは少なくて済みます。
5. それはカプセル化を増加させます。
Javaのネストされたクラスと内部クラスの違い
ネストされたクラスは、別のクラスの内部で定義されたクラスです。 ネストされたクラスには、静的クラスと非静的クラスの2つのタイプがあります。 非静的ネストされたクラスは内部クラスです。
このチュートリアルでは、リアルタイムのサンプルプログラムでjavaの内部クラスのすべての重要な機能をカバーしていることを願っています。 私はあなたがjavaで内部クラスを使用する基本的な考え方を理解していることを願っています。
読んでくれてありがとう!!!次へ⇒Javaのメンバ内部クラス
⇐前へ次へ⇒