variable - java interface用途




Java:與新關鍵字的接口如何可能? (6)

我正在從Java庫中讀取一些源代碼,我在這裡很困惑;

此代碼來自jaxb庫中的Document.java,而ContentVisitor是同一個包中的Interface ,我們如何使用new關鍵字創建Interface實例? 這不是非法的嗎?

public final class Document {
.
.
 private final ContentVisitor visitor = new ContentVisitor() {
    public void onStartDocument() {

        throw new IllegalStateException();
    }

    public void onEndDocument() {
        out.endDocument();
    }

    public void onEndTag() {
        out.endTag();
        inscopeNamespace.popContext();
        activeNamespaces = null;
    }
}


在代碼中,您不是要創建接口的實例。 相反,代碼定義了一個實現接口的匿名類,並實例化該類。

代碼大致相當於:

public final class Document {

    private final class AnonymousContentVisitor implements ContentVisitor {

        public void onStartDocument() {
            throw new IllegalStateException();
        }

        public void onEndDocument() {
            out.endDocument();
        }

        public void onEndTag() {
            out.endTag();
            inscopeNamespace.popContext();
            activeNamespaces = null;
        }
    }

    private final ContentVisitor visitor = new AnonymousContentVisitor();
}


實際上,您剛剛以匿名方式提供了此接口的實現。 這很常見,當然也是可能的。 在這裡查看更多信息。


請注意大括號打開的位置 - 您正在聲明一個內部對象(稱為anonymous class ),它實現了ContentVisitor和所有必需的方法!


這是有效的。 它被稱為匿名類。 看這裡

我們已經看到了定義和實例化匿名類的語法示例。 我們可以更正式地表達這種語法:

new class-name ( [ argument-list ] ) { class-body }

要么:

new interface-name () { class-body }






interface