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

本文解析了Java NIO中ByteBuffer的工作原理,揭示了ByteBuffer实例化背后的秘密,即通过HeapByteBuffer实现,并探讨了其子类MappedByteBuffer的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值