【Java】内部クラス

2018年3月11日

本稿では、内部クラスについて説明します。

内部クラスはインナークラスともよばれ、クラスブロックの中にさらにクラスを定義することで利用できます。

内部クラスは基本的には普通のクラスと変わりませんが、少し違う部分もあるのでその部分を説明していきます。

内部クラスの利用

内部クラスを定義するには

class クラス名{
class クラス名{
}
}

と定義します。

そして、インスタンス化するわけですが、まず外側をインスタンス化しなければ、内部クラスのインスタンス化はできません。

「外側クラス.内部クラス 変数名 = 外側クラス変数.new クラス名()」と定義しましょう。

public class Test {
	public static void main(String[] args){
		Ext ext = new Ext();
		Ext.Inner inner = ext.new Inner();
	}
}
class Ext{
	class Inner{
		Inner(){
			System.out.println("内部クラス");
		}
	}
}
実行結果

内部クラス

内部クラスは外側の変数をそのまま利用できます。(privateでも使用可能)

外側の変数名と内部クラスの変数名が被った場合は、「クラス型.this.変数名」と「this.変数名」でそれぞれアクセス可能です。

public class Test {
	public static void main(String[] args){
		Ext ext = new Ext();
		Ext.Inner inner = ext.new Inner();
	}
}
class Ext{
	private int num = 100;
	class Inner{
		int num = 50;
		Inner(){
			System.out.println(this.num);
			System.out.println(Ext.this.num);
		}
	}
}
実行結果

50
100

staticな内部クラス

内部クラスにはstaticを付与することもできます。

staticを付与すると、外側のクラスをインスタンス化しなくてもインスタンス化できるようになります。

そのかわり、外側のクラスの変数にアクセスできなくなります。

外側がインスタンス化されることが保障できないので、変数が実体化されているかわからないからですね。

もちろん外側の変数もstaticにすれば、アクセスできます。

static内部クラスのインスタンス化は「外側クラス.内部クラス 変数名 = new 外側クラス.内部クラス(引数)」と定義しましょう。

public class Test {
	public static void main(String[] args){
		Ext.Inner inner = new Ext.Inner();
	}
}
class Ext{
	private static int num = 100;
	static class Inner{
		int num = 50;
		Inner(){
			System.out.println(this.num);
			System.out.println(Ext.num);
		}
	}
}
実行結果

50
100

外側のクラス内であれば「内部クラス 変数名 = new 内部クラス(引数)」と省略しても、インスタンス化できます。

ローカル内部クラス

メソッド内の、「{}」内のみで有効なクラスです。

ifブロックであればブロック内にクラス宣言した後にクラスをインスタンス化できます。

ブロックの外側にはずれると、使用できなくなります。

public class Test {
	public static void main(String[] args){
		class LocalInner{
			LocalInner(){
				System.out.println("あいうえお");
			}
		}
		LocalInner inner = new LocalInner();
	}
}
実行結果

あいうえお

Java

Posted by nompor