Java抽象类和类型

时间:2016-02-10 14:12:45

标签: java abstract-class bytebuffer

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

如果out是一个抽象类并且抽象类无法被证实,那么如何声明对象ByteBuffer

ByteBuffer.wrap()返回ByteBuffer,但是ByteBuffer是一个抽象类,方法换行确实返回的ByteBuffer的实现类是什么?

3 个答案:

答案 0 :(得分:3)

这不是一个consructor调用,它是一个静态方法的调用。 抽象类可以有非抽象方法。

构造函数调用如下所示:

ByteBuffer out = new ByteBuffer(data);

答案 1 :(得分:2)

由于wrap()方法返回了特定的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();
    }
}

答案 2 :(得分:2)

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

在这个特定的例子中,根据ByteBuffer源代码,调用ByteBuffer.wrap()(注意调用静态方法,而不是构造函数)可以获得HeapByteBuffer的实例,它是ByteBuffer的子类。

我假设你正在尝试理解 subtype polymorphism 的概念:你想要一个ByteBuffer,你就得到一个。你真的不喜欢#39; t需要关心特定的实现。 您获得的任何实施都将提供ByteBuffer合同中声明的功能。