javaやC#では、インスタンス変数をnewする際に、後ろに中かっこを記述し定義を行うことができます。
ここで定義されるものは「無名クラス(匿名クラス)」と呼ばれ、クラス名を新たに定義することなく、インスタンス変数のクラス・インターフェースを継承・実装したクラスを定義することができます。
(ちなみに、「ラムダ式」と呼ばれる文法は「無名クラス」を応用したものになります)
以下、javaの例です。
【サンプルコード】
・AnonymousClass.java
1 2 3 4 5 6 7 8 9 |
public class AnonymousClass { private String STR = "Hello Class!"; public String getSTR() { return STR; } public void print() { System.out.println(getSTR()); } } |
・AnonymousInterface.java
1 2 3 |
public interface AnonymousInterface { public void print(); } |
・AnonymousMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class AnonymousMain { public static void main(String[] args) { // 匿名クラス作成(クラスの継承) AnonymousClass ac = new AnonymousClass(){ public void print() { System.out.println("Anonymous:" + getSTR()); } }; ac.print(); // 匿名クラス作成(インターフェースの実装) AnonymousInterface ai = new AnonymousInterface() { public void print() { System.out.println("Anonymous:Hello Interface!"); } }; ai.print(); } } |
【実行結果】
1 2 |
Anonymous:Hello Class! Anonymous:Hello Interface! |
いかがでしたでしょうか。
無名クラスは、使い捨てのクラスを作りたい時に便利です。
また、前述のラムダ式等を理解する上でも、無名クラスを理解する必要があります。
javaの入門書には出てくることが少ない文法だと思いますが、javaに慣れたらこの文法も早い内に理解することをお勧めします。
コメント
超初心者です、
無名クラスについては記述がいっぱいあるのですが
ではこれを通常のクラスで書いたらどうなるかという分かりやすい比較のサイトがなかなか見つかりません。
確かに、通常のクラスで書いた場合との比較がないとわかりにくいですよね…。
というわけで、通常のクラスと無名クラス(匿名クラス)を比べた記事を新たに書きました。
書き方だけではなく、無名クラスを使うと何が嬉しいのかも書いています。
https://cyzennt.co.jp/blog/2021/05/24/java%ef%bc%9a%e9%80%9a%e5%b8%b8%e3%81%ae%e3%82%af%e3%83%a9%e3%82%b9%e3%81%a8%e5%8c%bf%e5%90%8d%e3%82%af%e3%83%a9%e3%82%b9%ef%bc%88%e7%84%a1%e5%90%8d%e3%82%af%e3%83%a9%e3%82%b9%ef%bc%89%e3%81%ae/
参考になれば幸いです!