Is there any reason why an array in Java is an object?
6 Answers
Because the Java Language Specification says so :)
In the Java programming language arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.
So, unlike C++, Java provides true arrays as first-class objects:
- There is a
lengthmember. - There is a
clone()method which overrides the method of the same name in classObject. - Plus all the members of the class
Object. - An exception is thrown if you attempt to access an array out of bounds.
- Arrays are instanciated in dynamic memory.
Comments
Having arrays be objects means that you can do operations with them (e.g., someArray.count('foo')) instead of just doing it against them (e.g., count(someArray, 'foo')), which leads to more natural syntax.
1 Comment
clone (which has the correct covariant return type, is public, and has no checked exceptions). They also have an extra field, length. Beyond that, no extra methods or fields beyond what's provided with Object are available.Another point is that objects are mutable and are passed by reference. In arrays there aren't any fields/methods that you can use to change "properties" of the array, but you sure can mutate the element values. And the benefits of passing arrays by reference are pretty obvious (though functional programmers probably wish Java had immutable lists passed by value).
Edit: forgot to mention. In the period before autoboxing, it was helpful to be able to store arrays in collections, write them to ObjectStreams etc.
2 Comments
So that they get all the benefits thereof:
- getHashCode()
- toString()
etc.
And arrays aren't 'primitive', so if they can't be primitive, they must be objects.
1 Comment
hashCode and toString implementations are used (namely, identity hash code, and [LFooBar;@deadbeef) for arrays, so they're not really very useful in general. :-PI'm not sure about the official reason.
However, it makes sense to me that they are objects because operations can be performed on them (such as taking the length) and it made more sense to support these operations as member functions rather than introduce new keywords. Other operations include clone(), the inherited operations of object, etc. Arrays are also hashable and potentially comparable.
This is different from C (and native arrays in C++), where your arrays are essentially pointers to a memory offset.
4 Comments
Comparator that works with them.