はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回は匿名内部クラスについて説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第28回 Stream APIです。
匿名内部クラスとは?
以前の記事で扱ったインターフェースと抽象クラスはインスタンスの生成ができません。
インスタンスを生成するためには各抽象メソッドを実装するクラスを作成して、
そのクラスを通じてインスタンスを生成するだけでした。
しかし、匿名内部クラスを利用するとインスタンスを生成することと似たような効果を出すことができます。
匿名内部クラスはクラスのインスタンスを生成するときに作成できますし、
使い捨ての子供クラスだと理解すればいいです。
匿名内部クラスの書き方
1 2 3 |
データ型 変数名 = new データ型() { 処理 } |
上記のように継承したい親クラスのインスタンスを生成してから匿名内部クラスを定義します。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class AnonymousClassSample { public static void main(String[] args) { SuperClass superClass1 = new SuperClass() { @Override public void print() { System.out.println("overrided"); }; }; SuperClass superClass2 = new SuperClass(); superClass1.print(); superClass2.print(); } } class SuperClass { public void print() { System.out.println("text"); } } |
上記のサンプルのように匿名内部クラスを生成して親クラスのメソッドをオーバーライドします。
実行結果
1 2 |
overrided text |
匿名内部クラスの活用サンプル
サンプル1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "a is "; @Override public void print() { System.out.println(b+a); } }; abstractSample.a = 10; abstractSample.print(); } } abstract class AbstractSample { public abstract void print(); int a; } |
上記のように匿名内部クラスで抽象メソッドを定義して使います。
クラスのインスタンスを生成して使うことと同じ効果を出すことができます。
実行結果
1 |
a is 10 |
サンプル2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "Item : "; @Override public void print(String item) { System.out.println(b + item); } @Override public int operate(int a, int b) { return a+b; } }; abstractSample.print("apple"); System.out.println(abstractSample.operate(3, 9)); } } interface AbstractSample { public void print(String item); public int operate(int a, int b); } |
インターフェースの場合にも抽象メソッドを匿名内部クラスでオーバーライドするとインスタンスの生成ができます。
実行結果
1 2 |
Item : apple 12 |
サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class AnonymousClassSample { public static void main(String[] args) { AbstractSample abstractSample = new AbstractSample() { String b = "Item : "; @Override public void print(String item) { System.out.println(b + item); support(); } @Override public int operate(int a, int b) { return a+b; } public void support() { System.out.println("test"); } }; abstractSample.print("apple"); System.out.println(abstractSample.operate(3, 9)); abstractSample.support(); System.out.println(abstractSample.b); } } interface AbstractSample { public void print(String item); public int operate(int a, int b); } |
匿名内部クラスで新しく作成したフィールドやメソッドは外部で接続できなく、
匿名内部クラスでしか使えません。
サンプル4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class AnonymousClassSample { public static void main(String[] args) { anonymous(new AbstractSample() { @Override public int operate(int a, int b) { return a*b; } }); } static void anonymous(AbstractSample a) { System.out.println(a.operate(3, 4)); } } interface AbstractSample { public int operate(int a, int b); } |
上記のようにインターフェースや抽象クラスを引数にするメソッドに匿名内部クラスを渡すことができます。
終わりに
今回の記事は以上になります。
次回はThreadを学びましょう。
ご覧いただきありがとうございます。
コメント