Javaでは、メソッドと同様に、クラスの変数もメンバーとして別のクラスを持つことができます。
別のクラス内にクラスを書くことは、Javaでは可能です。
内部に記述されたクラスはネストされたクラスと呼ばれ、内部クラス(inner Class)を保持するクラスは外部クラス(outer Class)と呼ばれます。
内部クラスは、外部クラスとの紐づきが強く、外部クラス内部での利用に留まる場合に利用されるケースが多いです。
//Hogeのメンバーフィールド,メソッドを定義
class 内部クラス名 {
//内部クラスのメンバーフィールド,メソッドを定義
}
InnerClassSample.java
package jp.co.yourcompany.education.samples;
/**
* 内部クラスのサンプル
* @author raita.kuawabara
*/
public class InnerClassSample {
private int outerCounter = 0;
/**
* outerCounterのインクリメント
*/
public void outerIncrement(){
outerCounter++;
}
/**
* outerCounterを取得する
* @return outerCounter;
*/
public int getOuterCounter(){
return outerCounter;
}
/**
* インナークラス
*/
class InnerClass {
private int innerCounter = 0;
/**
* インナークラスからouterクラスのインクリメント
*/
public void outerIncrementByInner(){
outerCounter++;
}
/**
* innerCounterのインクリメント
*/
public void innerIncrement(){
innerCounter++;
}
/**
* innerCounterを取得する
* @return innerCounter
*/
public int getInnerCounter(){
return innerCounter;
}
}
/**
* javaコマンドから実行するクラス
*/
public static void main( String[] args ){
//sample
InnerClassSample sample = new InnerClassSample();
InnerClass inner = sample.new InnerClass();
System.out.println("outerCounter:" + sample.getOuterCounter() );
sample.outerIncrement();
System.out.println("sample.outerIncrement();" );
System.out.println("outerCounter:" + sample.getOuterCounter() );
inner.outerIncrementByInner();
System.out.println("inner.outerIncrementByInner();" );
System.out.println("outerCounter:" + sample.getOuterCounter() );
System.out.println("innerCounter:" + inner.getInnerCounter() );
inner.innerIncrement();
System.out.println("inner.innerIncrement" );
System.out.println("innerCounter:" + inner.getInnerCounter() );
}
}
出力結果
outerCounter:0
sample.outerIncrement();
outerCounter:1
inner.outerIncrementByInner();
outerCounter:2
innerCounter:0
inner.innerIncrement
innerCounter:1
内部クラスはサンプルクラスを見てわかるように外部クラスとの紐づけなしではクラスとして実行できません。
外部クラス.new インナークラスと外部クラスのインスタンスの内部クラスして利用します。
deploy/classes以下に生成されたクラスファイルをご覧ください。内部クラスが他のクラスの生成のされ方(名称)が異なることが分かります。