Java - 内部クラス
この章では、Java の内部クラスについて説明します。
ネストされたクラス
Java では、メソッドと同様に、クラスの変数も別のクラスをメンバーとして持つことができます。 Java では、別のクラス内にクラスを記述することが許可されています。内部で記述されたクラスは、ネストされたクラスと呼ばれます 、内部クラスを保持するクラスは 外部クラス と呼ばれます .
構文
以下は、ネストされたクラスを記述するための構文です。ここでは、クラス Outer_Demo は外部クラスであり、クラス Inner_Demo ネストされたクラスです。
class Outer_Demo {
class Inner_Demo {
}
}
ネストされたクラスは 2 つのタイプに分けられます −
- <リ>
非静的ネスト クラス − これらは、クラスの非静的メンバーです。
<リ>ネストされた静的クラス − これらはクラスの静的メンバーです。
内部クラス (非静的ネスト クラス)
内部クラスは、Java のセキュリティ メカニズムです。クラスをアクセス修飾子 private に関連付けることができないことはわかっています 、しかし、クラスを他のクラスのメンバーとして持つ場合、内部クラスをプライベートにすることができます。また、これはクラスのプライベート メンバーへのアクセスにも使用されます。
内部クラスには、定義する方法と場所に応じて 3 つのタイプがあります。それらは −
- 内部クラス
- メソッドローカル内部クラス
- 匿名内部クラス
内部クラス
内部クラスの作成は非常に簡単です。クラス内にクラスを書くだけです。クラスとは異なり、内部クラスはプライベートにすることができ、内部クラスをプライベートに宣言すると、クラス外のオブジェクトからアクセスできなくなります。
以下は、内部クラスを作成してアクセスするプログラムです。この例では、内部クラスを非公開にし、メソッドを介してクラスにアクセスします。
例
ライブデモ
class Outer_Demo {
int num;
// inner class
private class Inner_Demo {
public void print() {
System.out.println("This is an inner class");
}
}
// Accessing he inner class from the method within
void display_Inner() {
Inner_Demo inner = new Inner_Demo();
inner.print();
}
}
public class My_class {
public static void main(String args[]) {
// Instantiating the outer class
Outer_Demo outer = new Outer_Demo();
// Accessing the display_Inner() method.
outer.display_Inner();
}
}
ここで、Outer_Demo を観察できます 外部クラス Inner_Demo です 内部クラス display_Inner() です 内部クラスをインスタンス化するメソッドで、このメソッドは main から呼び出されます メソッド。
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
This is an inner class.
プライベート メンバーへのアクセス
前述のように、内部クラスは、クラスのプライベート メンバーにアクセスするためにも使用されます。クラスにアクセスするためのプライベート メンバーがあるとします。その中に内部クラスを記述し、内部クラス内のメソッドからプライベート メンバーを返します。たとえば、getValue() 、最後に別のクラス (プライベート メンバーにアクセスするクラス) から、内部クラスの getValue() メソッドを呼び出します。
内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。その後、外側のクラスのオブジェクトを使用して、内側のクラスをインスタンス化する方法は次のとおりです。
Outer_Demo outer = new Outer_Demo(); Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
次のプログラムは、内部クラスを使用してクラスのプライベート メンバーにアクセスする方法を示しています。
例
ライブデモ
class Outer_Demo {
// private variable of the outer class
private int num = 175;
// inner class
public class Inner_Demo {
public int getNum() {
System.out.println("This is the getnum method of the inner class");
return num;
}
}
}
public class My_class2 {
public static void main(String args[]) {
// Instantiating the outer class
Outer_Demo outer = new Outer_Demo();
// Instantiating the inner class
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
System.out.println(inner.getNum());
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
This is the getnum method of the inner class: 175
メソッドローカル内部クラス
Java では、メソッド内にクラスを記述できます。これはローカル型になります。ローカル変数と同様に、内部クラスのスコープはメソッド内に制限されています。
メソッドローカル内部クラスは、内部クラスが定義されているメソッド内でのみインスタンス化できます。次のプログラムは、メソッド ローカル内部クラスの使用方法を示しています。
例
ライブデモ
public class Outerclass {
// instance method of the outer class
void my_Method() {
int num = 23;
// method-local inner class
class MethodInner_Demo {
public void print() {
System.out.println("This is method inner class "+num);
}
} // end of inner class
// Accessing the inner class
MethodInner_Demo inner = new MethodInner_Demo();
inner.print();
}
public static void main(String args[]) {
Outerclass outer = new Outerclass();
outer.my_Method();
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
This is method inner class 23
匿名内部クラス
クラス名なしで宣言された内部クラスは、匿名内部クラスと呼ばれます .匿名の内部クラスの場合、それらを同時に宣言してインスタンス化します。一般に、クラスまたはインターフェースのメソッドをオーバーライドする必要がある場合はいつでも使用されます。匿名内部クラスの構文は次のとおりです-
構文
AnonymousInner an_inner = new AnonymousInner() {
public void my_method() {
........
........
}
};
次のプログラムは、匿名内部クラスを使用してクラスのメソッドをオーバーライドする方法を示しています。
例
ライブデモ
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
This is an example of anonymous inner class
同様に、匿名の内部クラスを使用して、具象クラスのメソッドとインターフェイスをオーバーライドできます。
引数としての匿名内部クラス
一般に、メソッドがインターフェース、抽象クラス、または具象クラスのオブジェクトを受け入れる場合、インターフェースを実装し、抽象クラスを拡張し、オブジェクトをメソッドに渡すことができます。クラスの場合は、メソッドに直接渡すことができます。
ただし、3 つのケースすべてで、匿名の内部クラスをメソッドに渡すことができます。メソッド引数として匿名の内部クラスを渡す構文は次のとおりです-
obj.my_Method(new My_Class() {
public void Do() {
.....
.....
}
});
次のプログラムは、匿名内部クラスをメソッド引数として渡す方法を示しています。
例
ライブデモ
// interface
interface Message {
String greet();
}
public class My_class {
// method which accepts the object of interface Message
public void displayMessage(Message m) {
System.out.println(m.greet() +
", This is an example of anonymous inner class as an argument");
}
public static void main(String args[]) {
// Instantiating the class
My_class obj = new My_class();
// Passing an anonymous inner class as an argument
obj.displayMessage(new Message() {
public String greet() {
return "Hello";
}
});
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
Hello, This is an example of anonymous inner class as an argument
静的ネスト クラス
静的内部クラスは、外部クラスの静的メンバーであるネストされたクラスです。他の静的メンバーを使用して、外部クラスをインスタンス化せずにアクセスできます。静的メンバーと同様に、入れ子になった静的クラスは、外部クラスのインスタンス変数とメソッドにアクセスできません。 static ネストされたクラスの構文は次のとおりです-
構文
class MyOuter {
static class Nested_Demo {
}
}
ネストされた静的クラスのインスタンス化は、内部クラスのインスタンス化とは少し異なります。次のプログラムは、ネストされた静的クラスの使用方法を示しています。
例
ライブデモ
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます −
出力
This is my nested class
Java