Java 摘要 Class 和类型

Java Abstract Class and types

我在Java Tutorials中读到这行代码:
ByteBuffer out = ByteBuffer.wrap(data);

如果 ByteBuffer 是一个抽象 class 并且抽象 class 不能被实例化,那么如何声明对象 out

ByteBuffer.wrap()return一个ByteBuffer,但作为ByteBuffer一个抽象class,[=14的实现class是什么=] 方法 wrap return?

因为 wrap() 方法 returns 一个特定的 ByteBuffer 实现,在这种情况下 HeapByteBuffer.

参见 wrap jdk1.6.0_43_src.zip

的实现
public static ByteBuffer wrap(byte[] array, int offset, int length)
{
    try {
        return new HeapByteBuffer(array, offset, length);
    } catch (IllegalArgumentException x) {
        throw new IndexOutOfBoundsException();
    }
}

这不是构造函数调用,而是静态方法的调用。 抽象 类 可以有非抽象方法。

构造函数调用如下所示:

ByteBuffer out = new ByteBuffer(data);

抽象类不能被实例化,但是它们的子类(如果不是抽象也是如此)可以。

在此特定示例中,根据 ByteBuffer 源代码,调用 ByteBuffer.wrap()(请注意,调用的是静态方法,而不是构造函数)会为您提供 HeapByteBuffer 的实例,它是 ByteBuffer 的子类。

我假设你正在尝试掌握 subtype polymorphism 的概念:你想要一个 ByteBuffer,你有一个。 你真的不需要关心具体的实现。 假定您获得的任何实现都将提供 ByteBuffer 合同中声明的功能。