ByteBuffer是java.nio中最常用的缓冲区,它提供了读写其他数据类型的方法。然而查看API文档后发现,java.nio.ByteBuffer其实是一个抽象类,其中有许多的抽象方法,如asCharBuffer(),asIntBuffer()等.
有两类静态工厂方法用于创建ByteBuffer:ByteBuffer.allocate(int capacity)和ByteBuffer.wrap(byte[] array).
例如:
ByteBuffer buffer = ByteBuffer.allocate(1024);
这里有一个疑问,难道buffer真是ByteBuffer的实例?一个抽象类的实例?
首先要明确的是,抽象类是不可能被实例化的,抽象类具有不完整的类定义,所以不能产生一个完整的实例。那这里的buffer实例到底是怎么回事?
我们在该语句处打上断点,debug运行,进入allocate方法内部,看到ByteBuffer的源码
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}
注意这里的
new HeapByteBuffer(capacity, capacity)
继续进入HeapByteBuffer的定义,看到
class HeapByteBuffer extends ByteBuffer
所以我们找到了buffer对象的真正类型,这就是HeapByteBuffer,它是ByteBuffer的子类,我们以后使用buffer对象进行任何操作,实际上使用的是HeapByteBuffer对象,只不过HeapByteBuffer类不是public的,所以不是API的一部分,仅从API文档我们是无法知道它的存在的.
另外,在ByteBuffer类的文档中,我们可以看到ByteBuffer还有一个子类MappedByteBuffer,这个类是public的,因此我们能够发现并直接使用它,它和内存映射有关,在这里就不再讨论了.