Является ли массив примитивным типом или объектом (или чем-то еще полностью)?
Вопрос в основном сам по себе. Я не смог найти API для массивов (кроме этого Arrays, но это просто определяет кучу статических вспомогательных функций для работы с реальными массивами), Если для него нет класса, это, по-видимому, предполагает, что массив не может быть Object
.
Однако тот факт, что массив имеет общедоступные поля, такие как length
и методы, которые он может вызывать как .equals()
и .clone()
, кажется, предлагает (очень сильно) полную противоположность.
Каково объяснение нечетной презентации и поведения примитивных массивов?
В качестве примечания я попытался использовать функцию "Open Implementation" Eclipse в методе .clone()
массива только сейчас, надеясь, что я смогу посмотреть, где и как этот метод был определен (поскольку он сказал 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
является подтипом B
, A[]
является подтипом B[]
.
Ответ 2
Спецификация языка Java должна дать вам представление:
Прямым суперклассом типа массива является Object.
Каждый тип массива реализует интерфейсы Cloneable
и java.io.Serializable
.
Более того:
Объект - это экземпляр класса или массив.
Таким образом, массивы не являются экземплярами, поэтому для их создания не требуется конструктор. Вместо этого вы используете Array Creation Exions.
Ответ 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
Такой короткий и простой, да < Тип > [] является типом Object
. Он распространяется непосредственно из Object
, насколько я понимаю. На нем есть все методы Object, toString()
, hashCode()
,... плюс специальная открытая переменная, называемая length
. Класс java.util.Arrays
- это класс утилиты для работы с типами массивов. Это немного запутанно, когда вы добавляете в беспорядок такие вещи, как: int[]
не наследуется от Object[]
. Кроме того, в отличие от других типов Object
нет конструкторов для типов массивов. Они уважают ключевое слово new
, но обычно это выделяется для размера. Это немного странно, но только один из этих языковых причуд.
Чтобы ответить на вопрос, да, они являются объектом.
Ответ 5
Массив - это объект-контейнер, который содержит фиксированное число значений одного типа.
См. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Ответ 6
Это объект
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Ответ 7
Только те несколько примитивных типов в Java, которые мы знали. В принципе, у нас все еще есть несколько шагов для создания массива, такого как declare, construct или при необходимости инициализировать, и это означает, что массив действительно является объектом.
Чем глубже, примитивные типы могут быть сохранены в памяти с исходными значениями, но объект является адресом (ссылкой). Итак, мы можем представить себе парадокс, как мы можем сохранить исходные значения в памяти, если массив является примитивным типом? Я думаю, что это так же, как String, но String является конечным объектом, так что вы можете легко построить объект String s = "s", как примитивный тип.