ホームページ  >  記事  >  Java  >  Javaの匿名内部クラスの違いの概要

Javaの匿名内部クラスの違いの概要

高洛峰
高洛峰オリジナル
2017-03-19 10:54:591523ブラウズ

匿名内部クラスは名前のない内部クラスです

名前がないため、匿名内部クラスは通常、コード記述を簡素化するために使用されます

しかし、匿名内部クラスを使用するには前提条件があります:継承する必要があります。 1 つの親クラスを使用するか、インターフェイスを実装します

例 1: 抽象メソッドを実装するために匿名の内部クラスを使用しないでください

abstract class Person {
    public abstract void eat();
}
 
class Child extends Person {
    public void eat() {
        System.out.println("eat something");
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Person p = new Child();
        p.eat();
    }
}

実行結果: 何かを食べる

ご覧のとおり、Child を使用して Person クラスを継承し、 Childインスタンスを実装し、それをPersonクラスへの参照にアップキャストします

しかし、ここでのChildクラスが一度しか使われない場合、独立したクラスとして書くのは面倒ではないでしょうか?

今回は匿名内部クラスを導入します

例 2: 匿名内部クラスの基本的な実装

abstract class Person {
    public abstract void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

実行結果: 何かを食べる

ご覧のとおり、curly の抽象クラス person にメソッドを直接配置しています。括弧で囲んで実装しました

これでクラスの記述を省略できます

さらに、匿名内部クラスをインターフェースでも使用できます

例 3: インターフェースで匿名内部クラスを使用します

interface Person {
    public void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

実行結果: 何かを食べる

上記の例からわかるように、クラスが抽象またはインターフェイスである限り、そのサブクラス内のメソッドは匿名の内部クラスを使用して実装できます

最も一般的な状況はマルチスレッド実装です。マルチスレッドを実装するには、Thread クラスまたは Runnable インターフェイスを継承する必要があります

例 4: Thread クラスの匿名内部クラス実装

public class Demo {
    public static void main(String[] args) {
        new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        }.start();
    }
}

実行結果: 1 2 3 4 5

例 5: 匿名内部クラスRunnable インターフェースのクラス クラスの実装

public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}

は実際にはもっと簡潔に書くことができます

public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        }).start();
    }

実行結果: 1 2 3 4 5


以上がJavaの匿名内部クラスの違いの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。