Javaのインナークラス(内部クラス)のサンプルです。
目次
クラス | インナークラスとは |
インナークラスのサンプル | |
インナークラスがstaticのサンプル |
インナークラスとは
Class クラス名 { Class クラス名{ } } |
- クラスの中にあるクラスを内部クラスまたはインナークラス(inner)またはネストしたクラスといいます。
- インナー(inner)は内部という意味で、ネストは入れ子という意味です。
- 内部クラスを含むクラスのことをエンクロージングクラスといいます。
- エンクロージング(enclosing)とは、囲むという意味です。
- 内側のクラスにstaticがつくと挙動が変わります。
→staticクラスをインスタンス化できます。
インナークラスのサンプル
以降は、インナークラスのサンプルです。
Outside.javaにインナークラスがあり、Test1.javaが呼び出すクラスです。
1.インナークラス (OutSide.java)
インナークラスのサンプルです。
package test1;
public class Outside {
private String moji = "です";
public class Inside{
private String iro = "赤";
public String getColor1() {
return iro + moji;
}
}
public void getColor2(){
Inside in1 = new Inside();
System.out.println(in1.getColor1());
}
}
3行目は外側のクラスで、6行目は内部クラスです。ネストしています。
10行目の変数mojiは4行目の外側のクラスのメンバ変数を参照しています。内部クラスは、外側のクラスの変数やメソッドへアクセスできます。
14行目は、外側のクラスのメソッドです。15行目で6行目の内部クラスをインスタンス化し、16行目でメソッドを実行します。
6行目の内側のクラスは、クラスの前にprotected,privateも付けることができます。
(その場合は、次のサンプルのTest1.javaの3,11,12行目はコメントにします。)
2.インナークラスを呼び出すクラス(Test1.java)
インナークラスを呼び出すクラスのサンプルです。
package test1;
import test1.Outside.Inside;
public class Test1 {
public static void main(String[] args) {
Outside out1 = new Outside();
out1.getColor2();//赤です
Inside in1 = out1.new Inside();
System.out.println(in1.getColor1());//赤です
}
}
3行目のtest1はパッケージ名でOutsideは外側のクラスでInsideはインナークラスです。
8行目は、外側のクラスのインスタンスを生成しています。
9行目は、外側のクラスのメソッドでインナークラスをインスタンス化しメソッドを実行しています。
11行目は、Out1.new Inside()という形式でインナークラスのインスタンスを生成しています。
インナークラスがstaticのサンプル
以降は、インナークラスがstaticのサンプルです。
Outside.javaにstaticのインナークラスがあり、Test1.javaが呼び出すクラスです。
1.staticのインナークラス
staticのインナークラスのサンプルです。
package test1;
public class Outside {
private String moji = "です";
static class Inside{
private String iro = "赤";
public String getColor1() {
// return iro + moji;
return iro;
}
}
public void getColor2(){
Inside in1 = new Inside();
System.out.println(in1.getColor1());
}
}
6行目は、classの前にstaticがついています。
10行目は、4行目の外側のクラスの変数mojiへアクセスできません。static付きのクラスは、外側のクラスの変数やメソッドへのアクセスが不可になります。
6行目の内側のクラスは、クラスの前にprotected,privateも付けることができます。
(その場合は、次のサンプルのTest1.javaの3,11,12行目はコメントにします。)
2.staticのインナークラスを呼び出す
staticのインナークラスを呼び出すサンプルです。
package test1;
import test1.Outside.Inside;
public class Test1 {
public static void main(String[] args) {
Outside out1 = new Outside();
out1.getColor2();//赤
Inside in1 = new Inside();
System.out.println(in1.getColor1());//赤
}
}
8,9行目は、外側のクラスをインスタンス化してメソッドを実行しています。
11行目は、staticのインナークラスをインスタンス化して、12行目でメソッドを実行しています。
staticは、インスタンス化しなくてよいクラスメソッドやクラス変数として使われますが、このstaticのインナークラスのときはインスタンス化します。インスタンス化しないとコンパイルエラーになります。
関連の記事
Java入門 クラスの仕組みとサンプル
Java コンストラクタのサンプル
Java クラスの継承の仕組みとサンプル
Java 匿名クラスのサンプル