`

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





分享到:
评论

相关推荐

    线程池 + 工厂模式 + 工厂方法 + 单件模式

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪个。这样,工厂方法让类的实例化推迟到子类中进行,提高了代码的灵活性和可扩展性。 **单件模式** 单例模式确保一个类只有一个实例,并提供一...

    Netty初步学习-HelloNetty.rar

    1. **创建 Bootstrap**:实例化 ServerBootstrap 并配置相应的参数,如绑定的端口、线程池等。 2. **配置 ChannelPipeline**:通过 `channelPipeline.addLast(new ServerHandler())` 添加自定义的处理器。 3. **绑定...

    Mina文件及字符串传输

    这个字符串可以通过Mina的WriteRequest对象发送,WriteRequest通常包含一个ByteBuffer或一个可序列化的对象。Mina会自动处理字符串到字节的转换,然后通过网络发送给服务器。 服务端接收到连接请求后,会创建一个...

    Java NIO 在并发型服务器设计中的应用

    - **Buffer(缓冲区)**:Buffer 是一个抽象类,拥有多个子类,包括 `ByteBuffer`、`CharBuffer` 等。这些缓冲区本质上是一块内存区域,用于存储和读取各种基本类型的数据。缓冲区的使用可以显著提高数据处理速度,...

    java学习路线.docx

    理解对象的实例化过程。 - **封装:** 封装是隐藏对象的属性和实现细节,仅对外提供公共的访问方法。学习如何通过访问修饰符(public、protected、private)来实现封装。 - **继承:** 继承是指一个类继承另一个类...

    基于netty的nio使用demo源码

    在Netty中,有多种类型的缓冲区,如ByteBuffer、CharBuffer、DoubleBuffer等,它们都是抽象类AbstractBuffer的子类。 3. **选择器(Selector)**:选择器允许单线程检查多个通道上的I/O事件,这样可以高效地处理多...

    基于java的开发源码-网络应用框架 Netty.zip

    Netty 的核心设计理念是通过提供一个高度抽象的、线程安全的事件循环(EventLoop)模型,简化了网络编程的复杂性。它基于 NIO(非阻塞I/O)库构建,充分利用了 Java 提供的异步I/O能力,实现了高并发和低延迟的特性...

    unit3.2.rar netty基础类netty基础类netty基础类netty基础类netty基础类

    2. **Channel**: `Channel`是Netty中的网络连接抽象,代表一个到另一端的连接,可以是TCP连接、UDP连接或者本地套接字等。`Channel`是异步的,它可以注册到`EventLoop`(事件循环)来处理I/O事件。 3. **EventLoop ...

    动态演示nio中的buffer相关操作.zip

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它提供了一种更有效、更灵活的方式来处理I/O操作。NIO的核心组件之一就是Buffer,它在I/O操作中扮演着至关重要的角色。这个压缩包“动态演示nio中的buffer相关...

    mina框架自定义解编码器

    - 初始化:设置解码缓冲区,通常是一个ByteBuffer。 - 解码:在decode方法中,读取缓冲区的数据,根据协议规则解析,直到解析完整个消息。 - 完成解码:当解析到一个完整的消息后,调用decodeComplete方法,将...

    Netty实战代码-2019-Netty-Action-Mayday-2019.zip

    Netty是一个高性能、异步事件驱动的网络应用程序框架,主要用于快速开发可维护的高性能协议服务器和客户端。这份资料主要涵盖了Netty的基础知识、核心组件以及实际应用,旨在帮助开发者深入理解和运用Netty。 一、...

    java代码-首先创建文件 test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上。 OutputStream与FileOutputStream创建文件,用write()写入数据,for循环语句组个写入数组数据,但会产生异常。

    首先,要创建一个名为`test.txt`的文件,我们需要实例化一个`FileOutputStream`对象。我们可以这样做: ```java import java.io.FileOutputStream; import java.io.IOException; public class Main { public ...

    JAVA知识点.pdf

    **JVM**是Java运行环境的核心部分,它为Java程序提供了一个抽象的计算机,使得Java程序可以在不同的操作系统上运行。 ##### 线程 Java中的线程是操作系统的一个调度单位,Java通过线程实现了任务的并行执行。Java...

    Mina2.0完全剖析,完全自学手册

    通过提供一个抽象的、事件驱动的异步API,Mina简化了Java NIO的使用,并支持多种传输协议,如TCP/IP和UDP/IP等。 ##### 第一步. 下载使用的Jar包 首先,需要下载必要的库文件: - **mina-core-2.0.0-M1.jar**:这...

    NettyDemo.zip

    3. **Bootstrap**:Bootstrap 是启动服务器或客户端的配置类,它定义了 Channel 实例的初始化参数,如事件循环组、处理器管道等。 4. **EventLoopGroup**:事件循环组是 Netty 的多线程模型,它管理一组线程,这些...

    Netty使用初步

    在Netty中,我们创建一个`Bootstrap`实例来配置服务器端或客户端的启动参数,包括线程模型、事件循环组、处理器管道等。例如,我们可以通过`EventLoopGroup`来指定线程池,`ServerBootstrap`和`Bootstrap`分别用于...

    java netty权威指南完整版带目录

    Java Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这本书“Java Netty权威指南”是深入理解并掌握Netty的关键资源,包含详细的目录,使得学习和查阅更为...

    CobaJNA:尝试 JNA

    2. **Java Native Access (JNA)**:相比之下,JNA提供了一个更高级、更简单的抽象层,减少了编写原生代码的需求。JNA的核心在于它的“类型映射”和“回调”机制,允许开发者直接在Java中定义原生函数的接口。 ### ...

    pushClient:nettyPusher 的套接字客户端

    【标题】"pushClient:nettyPusher 的套接字客户端" 涉及到的知识点主要集中在Java网络编程和Netty框架的应用上。Netty是一个高性能、...对于想要深入理解Netty和Java网络编程的开发者来说,这是一个很好的学习实例。

Global site tag (gtag.js) - Google Analytics