在Java中,为什么数组是对象?有什么具体原因吗?
Java中的数组之所以是对象,有什么原因吗?这样它们就可以从中获得所有好处:在Java中,为什么数组是对象?有什么具体原因吗?,java,arrays,Java,Arrays,Java中的数组之所以是对象,有什么原因吗?这样它们就可以从中获得所有好处: getHashCode() toString() 等等 数组不是“基元”,所以如果它们不能是基元,那么它们必须是对象。我不确定官方原因 但是,对我来说,它们是对象是有意义的,因为可以对它们执行操作(例如获取长度),并且支持这些操作作为成员函数而不是引入新的关键字更有意义。其他操作包括clone()、对象的继承操作等。数组也可以散列并具有潜在的可比性 这与C(以及C++中的本机数组)不同,在C中,数组本质上是指向内存
- getHashCode()
- toString()
数组不是“基元”,所以如果它们不能是基元,那么它们必须是对象。我不确定官方原因 但是,对我来说,它们是对象是有意义的,因为可以对它们执行操作(例如获取长度),并且支持这些操作作为成员函数而不是引入新的关键字更有意义。其他操作包括clone()、对象的继承操作等。数组也可以散列并具有潜在的可比性
这与C(以及C++中的本机数组)不同,在C中,数组本质上是指向内存偏移量的指针 让数组成为对象意味着您可以对它们进行操作(例如,someArray.count('foo')),而不仅仅是对它们进行操作(例如,count(someArray,'foo')),这会产生更自然的语法。另一点是对象是可变的,并且通过引用传递。在数组中,没有任何字段/方法可用于更改数组的“属性”,但可以更改元素值。通过引用传递数组的好处是显而易见的(尽管函数式程序员可能希望Java具有通过值传递的不可变列表)
编辑:忘了提了。在自动装箱之前的时期,能够在集合中存储数组、将数组写入ObjectStreams等都很有帮助。可能是因为他们希望尽可能使所有内容都成为对象。本机类型用于向后兼容。因为Java语言规范:) 在Java编程语言中,数组是动态创建的对象(§4.3.1),可以分配给Object类型的变量(§4.3.2)。类对象的所有方法都可以在数组上调用 <> >,与C++不同,java将真实数组提供为一个第一类对象:
- 有一个
成员李>length
- 有一个
方法重写类clone()
中同名的方法Object
- 加上类
的所有成员对象
- 如果试图访问超出边界的数组,将引发异常
- 数组在动态内存中实例化
比较器。@Chris:当然。但是compareTo接受一个对象,所以无论您比较什么(包括数组),都必须是一个对象。除了在Java中,数组没有任何额外的方法,除了clone
(它具有正确的协变返回类型,是公共的,并且没有选中的异常)。它们还有一个额外的字段,length
。除此之外,除了对象
之外,没有其他方法或字段可用。在Java中,使用默认的hashCode
和toString
实现(即标识哈希代码和[LFooBar;@deadbeef
)对于数组,它们通常不是很有用。:-PI希望通过引用传递+1,但为什么会有人希望通过值传递不可变的东西呢?具有不可变性的一个大+是,您可以通过引用传递而不必担心副作用。通过值传递不一定意味着复制值。实际上,在使用R的语言中参考透明度:区别是不相关的。