我在Java Tutorials中读到了这行代码:
ByteBuffer out = ByteBuffer.wrap(data);
如果out
是一个抽象类并且抽象类无法被证实,那么如何声明对象ByteBuffer
?
ByteBuffer.wrap()
返回ByteBuffer
,但是ByteBuffer
是一个抽象类,方法换行确实返回的ByteBuffer
的实现类是什么?
答案 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合同中声明的功能。