あるブロック内で宣言されたクラスの総称を入れ子クラス(NestedClass)といいます。
入れ子クラス(NestedClass)には以下の3種類あります。
クラス | 説明 |
---|---|
staticメンバークラス | クラス内で宣言されるstaticなクラス |
メンバークラス | クラス内で宣言されるインスタンスクラス |
ローカルクラス | メソッド内で宣言されるクラス |
また、上記の内、下2つを内部クラス(InnerClass)といいます。
これらのクラスはクラス名を持たずに利用することができ、このようなクラスを匿名クラスといいます。
ClassA.java
public class ClassA{
//staticメンバークラス
private static class staticClass {}
//メンバークラス(内部クラス)
private class instanceClass {}
//ローカルクラス(内部クラス)
void methodA(){
class localClass{}
}
}
メンバークラスとして宣言された入れ子クラスは、通常のフィールドやメソッドのようにアクセス修飾子を付けることができます。
(ローカルクラスにアクセス修飾子を付けるとコンパイルエラーになる。)
インスタンスメソッドから内部クラスのメソッドを呼び出すには、通常のクラスを利用するのと同じように、まず内部クラスのインスタンスを生成し、メソッドにアクセスします。
以下のコード例では、5行目で内部クラスのインスタンスを生成し、6行目でメソッドを実行しています。
ClassA.java
package test;
public class ClassA {
//インスタンスメソッド
public void callInner(){
Inner i = new Inner();
i.print();
}
//内部クラス
public class Inner{
public void print(){
System.out.println("this code is a InnerClass");
}
}
}
このコードは、究極的には以下のように簡略化することができます。
ClassA.java
//インスタンスメソッド
public static void callInner(){
new Inner().print();
}
staticメソッドから内部クラスのメソッドを呼び出すには、まず外側のクラスのインスタンスを取得してからその参照を用いて内部クラスのインスタンスを取得して、メソッドにアクセスします。
以下のコード例では、6行目で外側のクラスであるClassA
のインスタンスを用いて内部クラスであるInner
のインスタンスを取得して、7行目でメソッドを実行しています。
ClassA.java
package test;
public class ClassA {
//staticメソッド
public static void callInner(){
Inner i = new ClassA().new Inner();
i.print();
}
//内部クラス
public class Inner{
public void print(){
System.out.println("this code is a InnerClass");
}
}
}
このコードは、究極的には以下のように簡略化することができます。
ClassA.java
//staticメソッド
public static void callInner(){
new ClassA().new Inner().print();
}
例えばClassB.java
からClassA.java
の内部クラスを利用するには以下のように記述します。
ClassA.java
package test;
public class ClassA {
//内部クラス
public class Inner{
public void print(){
System.out.println("this code is a InnerClass");
}
}
}
ClassB.java
package test;
public class ClassB {
public static void main(String[] args) {
new ClassA().new Inner().print();
}
}
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!