在Java中,为什么数组是对象?有什么具体原因吗?

在Java中,为什么数组是对象?有什么具体原因吗?,java,arrays,Java,Arrays,Java中的数组之所以是对象,有什么原因吗?这样它们就可以从中获得所有好处: getHashCode() toString() 等等 数组不是“基元”,所以如果它们不能是基元,那么它们必须是对象。我不确定官方原因 但是,对我来说,它们是对象是有意义的,因为可以对它们执行操作(例如获取长度),并且支持这些操作作为成员函数而不是引入新的关键字更有意义。其他操作包括clone()、对象的继承操作等。数组也可以散列并具有潜在的可比性 这与C(以及C++中的本机数组)不同,在C中,数组本质上是指向内存

Java中的数组之所以是对象,有什么原因吗?

这样它们就可以从中获得所有好处:

  • 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
    中同名的方法
  • 加上类
    对象
    的所有成员
  • 如果试图访问超出边界的数组,将引发异常
  • 数组在动态内存中实例化

嗯,数组当然不是原始的。你来自什么背景?实际上,获取Java数组的长度不是一个操作。长度是对象的公共成员。这是真的。我不知道他们为什么不在数组上加一个最终的getLength()。数组按自然顺序是不可比较的,但当然你可以自由地编写一个与它们一起工作的
比较器。@Chris:当然。但是compareTo接受一个对象,所以无论您比较什么(包括数组),都必须是一个对象。除了在Java中,数组没有任何额外的方法,除了
clone
(它具有正确的协变返回类型,是公共的,并且没有选中的异常)。它们还有一个额外的字段,
length
。除此之外,除了
对象
之外,没有其他方法或字段可用。在Java中,使用默认的
hashCode
toString
实现(即标识哈希代码和
[LFooBar;@deadbeef
)对于数组,它们通常不是很有用。:-PI希望通过引用传递+1,但为什么会有人希望通过值传递不可变的东西呢?具有不可变性的一个大+是,您可以通过引用传递而不必担心副作用。通过值传递不一定意味着复制值。实际上,在使用R的语言中参考透明度:区别是不相关的。