32
interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

結果は?

A. テスト
B. null
C. 実行時に例外がスローされる。
D. 1 行目のエラーが原因で
コンパイルが失敗します。 E. 4 行目のエラーが原因でコンパイルが失敗します。
F. 5 行目のエラーが原因でコンパイルが失敗します。

この質問の答えとその理由は何ですか? この質問に関して、もう1つ質問があります。4 行目で A のオブジェクトを作成しています。インターフェースのオブジェクトを作成することは可能ですか?

4

6 に答える 6

91

ここに表示されているのは、匿名の内部クラスです。

次のインターフェイスがあるとします。

interface Inter {
    public String getString();
}

次のように、そのインスタンスのようなものを作成できます。

Inter instance = new Inter() {
    @Override
    public String getString() {
        return "HI";
    }
};

これで、定義したインターフェースのインスタンスができました。ただし、実際に行ったことは、インターフェイスを実装するクラスを定義し、同時にクラスをインスタンス化することであることに注意してください。

于 2010-10-22T19:05:29.823 に答える
5

test出力になるはずです。これは匿名内部クラスの例です。

Comparatorこれは、クロージャーのエミュレーションとしてインターフェイスで使用される非常に一般的なパターンです。

于 2010-10-22T19:03:51.143 に答える
1

トリックは匿名の内部クラスだけではありません。この出力テストにより、toStringメソッドがオーバーライドされSystem.out.println、オブジェクトが暗黙的にtoStringメソッドを呼び出します。

于 2011-01-03T19:15:13.420 に答える
1

これも試してみてください...無名クラスの名前が生成されました!

Inter instance = new Inter() {
    public String getString() {
        return "HI" + this.getClass();
    }
};
于 2011-02-15T12:11:38.710 に答える
0

インターフェイスを実装する匿名クラスのオブジェクトを作成できます。

匿名クラスを使用すると、コードをより簡潔にすることができます。クラスの宣言とインスタンス化を同時に行うことができます。名前がないことを除けば、ローカル クラスに似ています。ローカル クラスを 1 回だけ使用する必要がある場合に使用します。

1 つのメソッドを宣言するインターフェイスがある場合は、toString最初にこのインターフェイスを実装するクラスを作成し、次にこのクラスのオブジェクトを作成できます。

interface TestA {
    String toString();
}

class TestB implements TestA {
    @Override
    public String toString() {
        return "test";
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestB());
    }
}

または、匿名クラスのオブジェクトを作成して、このコードを簡素化できます。

interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            @Override
            public String toString() {
                return "test";
            }
        });
    }
}

どちらの場合も、印刷され"test"ます。

于 2020-08-31T02:36:09.773 に答える