
インナークラスとは?
クラス宣言の中に、さらにクラス宣言を書くことで、その書かれた内側のクラスのことです。
ぶっちゃけ、クラス構造がややこしくなりますし、理解しずらいので、この技術自体は、使う機会は少ないです。ただ、たまに見かけたときに動揺しないように、どのように使うか等の知識だけは頭に入れておきましょう。
書かれるクラス内容によって、下記3種類に分かれます。
- メンバクラス
- ローカルクラス
- 匿名クラス
メンバクラス
特徴
クラスブロックの直下に書きます。
staticなし
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Inner { int num; Inner() { num = 5; } //メンバクラス class Inclass { void methodA() { //外部クラス「Inner」の、インスタンス変数 num = 10; System.out.println(num); } } } |
呼び出し方
1 2 3 4 5 6 7 8 9 |
public static void main(String args[]) { //外部クラスのインスタンスを生成 Inner in = new Inner(); //外部クラス内のメンバクラスを生成する。 Inner.Inclass inClass = in.new Inclass(); inClass.methodA(); } |
static付
通常のクラスであれば、staticを付けることはできないですが、メンバクラスであれば、staticを付けることが許されています。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Inner { static int num; static { num = 5; } //メンバクラス:staticが付いている。 static class Inclass { void methodA() { //外部クラス「Inner」の、static変数のみ扱える。 num = 10; System.out.println(num); } } } |
呼び出し方
staticの場合は、下記のように、「親クラス.メンバクラス単位」でnewすることができます。
1 2 3 4 5 6 |
public static void main(String args[]) { Inner.Inclass in = new Inner.Inclass(); in.methodA(); } |
ローカルクラス
特徴
- メソッドブロックの直下に書きます。
- 宣言したメソッドの中でのみ使うことができるクラス
- 外部クラスのメンバにはアクセス可能だが、同じメソッド内のローカル変数は使えない。
使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Inner { public void methodA() { //ローカルクラス:メソッド内でのみ使用可能 class InClass{ public void inClasMethod() { System.out.println("Hello World"); } } InClass in = new InClass(); in.inClasMethod(); } } |
呼び出し方
1 2 3 4 5 6 |
public static void main(String args[]) { Inner in = new Inner(); in.methodA(); } |
匿名クラス
特徴
- 文の一部として書きます。
- 一回しかインスタンスを作成しない、その場限りの使い捨てクラスが欲しいといった場合に使います。
- 「宣言と利用を同時に行う」というのも、特徴の一つです。
サンプル
匿名クラスを使うには、親クラスが必要になります。親クラスを継承して、匿名クラスを実装する必要があります。(interfaceでもかまいません。)
1 2 3 4 5 6 7 |
public class Tokumei { void methodA() { //何もしない。 } } |
下記のように呼び出せます。「new 親クラス{処理内容}」という形で記述することで、クラスの宣言と、インスタンス化を同時に行ってしまえています。
1 2 3 4 5 6 7 8 9 10 11 |
public static void main(String args[]) { Tokumei tokume = new Tokumei() { public void methodA() { System.out.println("匿名テストです。"); } }; tokume.methodA(); } |
この記事へのコメントはありません。