Java 内部クラス
この章では、Java の内部クラスについて学びます。
Java では、あるクラスの中に別のクラスを入れ子にすることができます。構文は次のとおりです。
class OuterClass { // 外部类
// ...
class NestedClass { // 嵌套类,或称为内部类
// ...
}
}
内部クラスにアクセスするには、外部クラスのオブジェクトを作成し、その後内部クラスのオブジェクトを作成することで実現できます。
入れ子クラスには2つのタイプがあります:
- 非静的内部クラス
- 静的内部クラス
非静的内部クラス
非静的内部クラスは、あるクラスの中に別のクラスが入れ子になっているものです。外部クラスのメンバーにアクセスする権限を持ち、通常は内部クラスと呼ばれます。
内部クラスは外部クラスの中にネストされているため、まず外部クラスをインスタンス化し、その後内部クラスのオブジェクトを作成する必要があります。
例
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
int x = 10;
class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
上記の例を実行すると、出力結果は次のようになります:
15
プライベート内部クラス
内部クラスは private または protected で修飾できます。内部クラスを外部クラスからアクセスされたくない場合は、private 修飾子を使用できます:
例
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
上記の例では InnerClass がプライベート内部クラスとして設定されているため、実行するとエラーが発生します:
MyMainClass.java:12: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
静的内部クラス
静的内部クラスは static キーワードを使用して定義できます。静的内部クラスは、外部クラスを作成しなくても直接アクセスできます:
例
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
上記の例を実行すると、出力結果は次のようになります:
5
注意:静的内部クラスは外部クラスのメンバーにアクセスできません。
内部クラスから外部クラスのメンバーにアクセスする
内部クラスの高度な使い方の1つは、外部クラスのプロパティとメソッドにアクセスできることです:
例
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
上記の例を実行すると、出力結果は次のようになります:
10その他の拡張
Java オブジェクトとクラス