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

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

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

Каково объяснение нечетной презентации и поведения примитивных массивов?

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

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

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

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

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

Кроме того :

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

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

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

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

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

Хорошо, здесь вы идете: –

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

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

И, Раздел 10 : –

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

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

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

Чтобы ответить на вопрос, да, они являются объектом.

Массив – это контейнерный объект, который содержит фиксированное количество значений одного типа.

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

Только те несколько примитивных типов в Java, которые мы знали. В принципе, у нас все еще есть несколько шагов для создания массива, такого как объявление, построение или инициализация, если это необходимо, и это означает, что массив действительно является объектом.

Чем глубже, примитивные типы могут быть сохранены в памяти с исходными значениями, но объект является адресом (ссылкой). Итак, мы можем представить себе парадокс, как мы можем сохранить исходные значения в памяти, если массив является примитивным типом? Я думаю, что это так же, как String, но String является конечным объектом, так что вы можете легко построить объект String s = “s”, как примитивный тип.

Interesting Posts

Какие значения можно передать атрибуту события тега f: ajax?

Элемент модели, переданный в словарь, имеет тип .. но для этого словаря требуется элемент модели типа

Скажите Windows 7, чтобы остановить попытку перейти на Windows 10?

Google Checkout – XML ​​API связывает серийный номер обратного вызова с исходным заказом

Контракт и наложение видео FFMPEG

Контролировать учетные записи пользователей linux ubuntu

«Ожидание выхода целевого устройства в онлайн» в Android Studio 2.3

Не удалось найти соответствующий навигационный случай с идентификатором-view-id ‘/pages/index.xhtml’

Windows 7 Virtual PC + Linux Ubuntu

Почему java.util.concurrent.ArrayBlockingQueue использует «while» вместо «if» вокруг вызовов для ожидания ()?

реализация rand ()

Лучше ли использовать смещение или вручную установить напряжение ЦП (относительно долговечности ЦП)?

Java 8 stream .min () и .max (): зачем это компилируется?

Как читать данные в формате PDF с помощью iTextSharp?

Диспетчер задач показывает слишком много процессов exe для Google Chrome

Давайте будем гением компьютера.