2012-06-22 67 views
1

我正在讀一本書中作者用這樣混亂實施

public class Pool<T> { 

    public interface PoolObjectFactory<T> {  
     public T createObject();   
    } 

    private final List<T> freeObjects; 
    private final PoolObjectFactory<T> factory; 
    private final int maxSize; 

    public Pool(PoolObjectFactory<T> factory, int maxSize) { 

     this.factory = factory; 
     this.maxSize = maxSize; 
     this.freeObjects = new ArrayList<T>(maxSize); 

    } //end of constructor 

} //end of class Pool<T> 

代碼的接口然後,他使用的代碼是這樣的

PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() { 

    @Override 
    public KeyEvent createObject() {     
     return new KeyEvent();       
    } //end of createObject() 

}; 

keyEventPool = new Pool<KeyEvent>(factory, 100); 

我想問在該行PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() {..};他沒有說implements PoolObjectFactory。爲什麼?當你使用接口,那麼你使用implements關鍵字?

感謝

回答

0

您在這裏創建一個匿名類。不需要implements關鍵字。請注意,在這種情況下,您使用新的PoolObjectFactory,這清楚地表明您正在實現的類 - 無需再次使用implements實現來指示它。

另一方面,如果你正在創建一個子類,你需要指出它是父接口,然後你需要implements關鍵字。

+0

你的意思是聲明'new PoolObjectFactory (){..}'意味着'創建並同時實例化一個名爲PoolObjectFactory的新類,它實現了接口PoolObjectFactory'。意思是我可以使用新的'Basit (){...}'。但是,如果在類體中我重寫該方法,則Basit類僅實現PoolObjectFactory。如果我不覆蓋該方法,那麼這意味着我只是創建並實例化一個新類,但它沒有實現任何接口。最後,將新創建的類實例分配給變量'Basit factory ='。我對嗎 ? – Basit

+0

不,不是。首先你創建一個匿名類 - 這是一個沒有名字的類,但是,你確實要實例化它。你不能實例化一個沒有實現方法的類,所以我不太瞭解你的語句的第二部分。 –

+0

我的意思是匿名類實現接口,因爲我重寫類體中的方法。假設我使用了這樣的'PoolObjectFactory factory = new PoolObjectFactory (){public int i = 2;}';請參閱類體中的重寫方法。這個類是否也實現了PoolObjectFactory接口?我可以使用類似'{public int i = 2; public PoolObjectFactory(){}}}; ? – Basit

1

你只當你定義一個名爲類需要implements
在這種情況下,作者正在使用實現接口的匿名(未命名)內部類。

編輯:對於背景,很多人不知道/欣賞的東西是編譯器會爲匿名內部類生成一個.class文件。 例如下面產生Fred.class文件和弗雷德$ 1.class文件:

public class Fred { 
    public void sayHelloFred() { 
     Object o = new MouseAdapter() { 
     }; 
    } 
} 

所有這些.class文件仍然需要運送,並在運行時加載,就像如果他們被命名爲類。

5

筆者使用了一種名爲anonymous class特殊構造,這是使用下面的語法定義:

new interface-name() { class-body } 
0

作者使用匿名類。在這種情況下,將創建一個沒有標識符的類,只創建一個實例並將其分配給變量factory

0

定義類時,使用implements關鍵字來指示類將滿足接口的要求。在有問題的行中,作者實例化了的一個匿名類。