variable - java interface用途
Java:與新關鍵字的接口如何可能? (6)
在java中有一個叫做匿名類的東西http://www.java2s.com/Code/Java/Class/Anonymous-class.htm
我正在從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
類型/類,它實現了該接口。 看看教程 - 本地和匿名內部類 。
實際上,您剛剛以匿名方式提供了此接口的實現。 這很常見,當然也是可能的。 在這裡查看更多信息。
請注意大括號打開的位置 - 您正在聲明一個內部對象(稱為anonymous class
),它實現了ContentVisitor
和所有必需的方法!
這是有效的。 它被稱為匿名類。 看這裡
我們已經看到了定義和實例化匿名類的語法示例。 我們可以更正式地表達這種語法:
new class-name ( [ argument-list ] ) { class-body }
要么:
new interface-name () { class-body }