Вопрос-ответ

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

Является ли массив примитивным типом или объектом (или чем-то полностью другим)?

Вопрос в принципе не требует пояснений. Я не смог найти API для массивов (кроме этого Arrays, но это просто определяет набор статических вспомогательных функций для работы с реальными массивами). Если для него нет класса, это, по-видимому, наводит на мысль, что массив не может быть Object.

Однако тот факт, что массив имеет общедоступные поля типа length и методы, которые он может вызывать типа .equals() и .clone(), кажется, предполагает (очень убедительно) полную противоположность.

Чем объясняется странное представление и поведение примитивных массивов?

В качестве примечания, я только что попытался использовать функцию Eclipse "Открытой реализации" в .clone() методе array, надеясь, что смогу посмотреть, где и как был определен этот метод (поскольку в нем сказано, что int[] переопределяет его из Object), но на самом деле это привело к зависанию и сбою всего моего Eclipse...

Переведено автоматически
Ответ 1

Для каждого типа массива существует класс, поэтому для int[] есть класс, для Foo[] есть класс. Эти классы создаются JVM. Вы можете получить к ним доступ с помощью int[].class, Foo[].class. Прямым суперклассом этих классов являются 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);
}

Также существует правило подтипирования во время компиляции, если A is subtype of B, A[] is subtype of B[] .

Ответ 2

Спецификация языка Java должна дать вам представление:


Прямым суперклассом типа массива является Object .


Каждый тип массива реализует интерфейсы Cloneable и java.io.Serializable.


Более того:


Объект - это экземпляр класса или массив.


Итак, массивы не являются экземплярами, и поэтому вам не нужен конструктор для их создания. Вместо этого вы используете выражения для создания массива.

Ответ 3

Смотрите приведенный ниже код. Он компилируется:

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

Теперь для любого примитивного типа вы не можете вызвать метод (toString()), определенный в классе Object (Или, если уж на то пошло, любой метод)... Итак, массив по сути является Object.

Хорошо, поехали:

Из раздела JLS 4.3:


Существует четыре вида ссылочных типов: типы классов (§8), типы интерфейсов (§9), переменные типа (§4.4) и типы массивов (§10).


И, раздел 10:


В языке программирования Java массивы являются объектами (§4.3.1), создаются динамически и могут быть назначены переменным типа Object (§4.3.2). Все методы класса Object могут быть вызваны для массива.


Итак, из первой цитаты, Array на самом деле это не класс... Это другой тип. Но, по сути, массивы - это объекты, хотя и не какого-то Class, но они имеют Array тип. Таким образом, они не являются экземплярами какого-либо класса, а могут быть объектами array, которые определены для создания таким образом...

Ответ 4

Итак, коротко и просто, да, <Type>[] - это тип Object. Он расширяется непосредственно из Object, насколько я понимаю. В нем есть все объектные методы, toString(), hashCode(), ... Плюс специальная открытая переменная с именем length. Класс java.util.Arrays - это служебный класс для работы с типами массивов. Это немного сбивает с толку, когда вы добавляете к беспорядку такие вещи, как: int[] не наследуется от Object[]. Также, в отличие от других Object типов, для типов массивов нет конструкторов. Они учитывают new ключевое слово, но обычно оно используется для определения размера. Это немного странно, но всего лишь одна из языковых причуд.

Однако, отвечая на вопрос, да, это объект.

java arrays