`

抽象类ByteBuffer能否实例化?——由一个实例化疑问说开去

阅读更多
    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的,因此我们能够发现并直接使用它,它和内存映射有关,在这里就不再讨论了.





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics