0
abstract class IntBuffer

似乎你无论如何都不能创建这个类的实例,因为它声明为抽象但同时,有一个静态工厂方法 IntBuffer allocate(int capacity),现在你可以通过简单地创建一个实例,Buffer b=IntBuffer.allocate(128) 但等待,IntBuffer 是抽象的,它没有任何预定义的具体子类。那么这是如何工作的呢?

编辑 - - - - - - -

我已经怀疑它返回了 IntBuffer 的子类,但是我找不到 HeapIntBuffer 或任何此类子类。我猜是私下宣布的吗??因此它不在 api doc 中!

4

2 回答 2

2

仅仅因为有一个静态方法并不意味着它正在创建一个just IntBuffer的实例。这是工厂方法可以做的事情的一个简短示例:

abstract class Abstract {
   static Abstract createInstance(int size) {
       return size < 10 ? new SmallImplementation() : new LargeImplementation();
   }

   public abstract String getDescription();
}

class SmallImplementation extends Abstract {
   @Override public String getDescription() {
       return "I'm an implementation for small sizes";
   }
}

class LargeImplementation extends Abstract {
   @Override public String getDescription() {
       return "I'm an implementation for large sizes";
   }
}

public class Test {
   public static void main(String[] args) throws InterruptedException {
       Abstract small = Abstract.createInstance(1);
       Abstract large = Abstract.createInstance(100);
       System.out.println(small.getDescription());
       System.out.println(large.getDescription());
   }
}

这基本上是多态性的核心 - 中的代码Test.main 知道Abstract; 选择正确的实现取决于工厂方法。

于 2015-03-02T14:00:58.027 回答
1

它之所以有效,是因为 allocate 不返回 IntBuffer,而是 IntBuffer 的子类。这是 IntBuffer.allocate 的源代码:

public static IntBuffer allocate(int capacity) {
    if (capacity < 0)
        throw new IllegalArgumentException();
    return new HeapIntBuffer(capacity, capacity);
}

HeapIntBuffer 类扩展了 IntBuffer,因此当您在代码中说:

IntBuffer myBuffer = IntBuffer.allocate(size);

任务很好。

于 2015-03-02T14:02:04.987 回答