实现界面时的困惑

时间:2012-06-22 13:26:21

标签: java

我正在读一本书,其中作者使用了这样的代码

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关键字?

由于

5 个答案:

答案 0 :(得分:5)

作者正在使用一个名为anonymous class的特殊构造,它使用以下语法定义:

new interface-name () { class-body }

答案 1 :(得分:1)

在定义命名类时,只需要implements 在这种情况下,作者使用匿名(未命名)内部类来实现接口。

编辑:对于背景,许多人不了解/欣赏的是编译器将为匿名内部类生成.class文件。 例如以下代码生成Fred.class文件和Fred $ 1.class文件:

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

所有这些.class文件仍然需要在运行时加载和加载,就像它们被命名为类一样。

答案 2 :(得分:0)

您正在此处创建一个匿名类。不需要implements关键字。请注意,在这种情况下,您使用新的PoolObjectFactory,这清楚地表明您正在实现的类 - 无需再使用工具再次指示它。

另一方面,如果要创建子类,则需要说明它是哪个父接口,然后需要implements关键字。

答案 3 :(得分:0)

作者使用匿名类。在这种情况下,创建一个没有标识符的类,只创建一个实例并将其分配给factory变量。

答案 4 :(得分:0)

定义类时,使用implements关键字来指示该类将满足接口的要求。在该行中,作者实例化一个匿名类。