Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is an array a primitive type or an object (or something else entirely)?

The question is basically self-explanatory. I haven't been able to find an API for arrays (other than this Arrays, but this just defines a bunch of static helper functions for dealing with actual arrays). If there is no class for it, this seems to suggest that an array can't be an Object.

However, the fact that an array has public fields like length and methods that it can invoke like .equals() and .clone() seem to suggest (very strongly) the complete opposite.

What is the explanation for the odd presentation and behavior of primitive arrays?

As a note, I tried to use the "Open Implementation" Eclipse feature on the .clone() method of an array just now, hoping that I would be able to look at where and how this method was defined (since it said int[] overrode it from Object), but it actually caused my entire Eclipse to freeze up and crash...

like image 597
asteri Avatar asked Oct 09 '12 19:10

asteri


People also ask

Is array primitive type or object?

No, arrays are not primitive datatypes in Java. They are container objects which are created dynamically.

Is array primitive or non-primitive?

Examples of non-primitive types are Strings, Arrays, Classes, Interface, etc.

What is a primitive type array?

An array is a collection of similar data types. Array is a container object that hold values of homogenous type. It is also known as static data structure because size of an array must be specified at the time of its declaration.

Is an array an object or a primitive type value can an array contain elements of an object type as well as a primitive type?

Arrays of primitive types hold primitive types. "Every Java Programmers knows, Array is a collection of Objects, it doesn't matter whether it contains primitive data types or Strings." Wrong. An array is an object, but it doesn't necessarily contain objects.


5 Answers

There is a class for every array type, so there's a class for int[], there's a class for Foo[]. These classes are created by JVM. You can access them by int[].class, Foo[].class. The direct super class of these classes are Object.class

public static void main(String[] args) {     test(int[].class);     test(String[].class); }  static void test(Class clazz) {     System.out.println(clazz.getName());     System.out.println(clazz.getSuperclass());     for(Class face : clazz.getInterfaces())         System.out.println(face); } 

There's also a compile-time subtyping rule, if A is subtype of B, A[] is subtype of B[].

like image 190
irreputable Avatar answered Sep 18 '22 16:09

irreputable


The Java Language Specification should give you an idea:

The direct superclass of an array type is Object.

Every array type implements the interfaces Cloneable and java.io.Serializable.

Moreover:

An object is a class instance or an array.

So arrays are not instances and therefore you don't need a constructor to create them. Instead you use the Array Creation Expressions.

like image 30
Baz Avatar answered Sep 18 '22 16:09

Baz


See the below code. It compiles:

    int[] arr = new int[2];
    System.out.println(arr.toString());

Now, on any primitive type, you cannot call a method(toString()) defined in Object class (Or, any method for that matter)... So, an array is essentially an Object.

OK, here you go:

From the JLS Section 4.3:

There are four kinds of reference types: class types (§8), interface types (§9), type variables (§4.4), and array types (§10).

And, Section 10:

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, from the first quote, Array is not actually a class... It is another type. But, essentially arrays are objects, though not of some Class, but they are of Array type. So they are not instances of some class, and may be objects of array are defined to be created that way...

like image 23
Rohit Jain Avatar answered Sep 20 '22 16:09

Rohit Jain


So short and simple, yes <Type>[] is a type of Object. It extends directly from Object as I understand it. There are all the Object methods on it, toString(), hashCode(), ... Plus a special exposed variable called length. The class java.util.Arrays is a utility class for dealing with types of Arrays. It's a little confusing when you add to the mess things like: int[] does not inherit from Object[]. Also, unlike other Object types, there are no constructors for array types. They respect the new keyword but that is usually to allocate for the size. It's a little bizarre, but just one of those language quirks.

To answer the question though, yes they are an object.

like image 29
Greg Giacovelli Avatar answered Sep 16 '22 16:09

Greg Giacovelli


An array is a container object that holds a fixed number of values of a single type.

See http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

like image 31
Aleksandr M Avatar answered Sep 17 '22 16:09

Aleksandr M