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

Вопрос в основном сам по себе. Я не смог найти 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, но обычно это выделяется для размера. Это немного странно, но только один из этих языковых причуд.

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

Ответ 7

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

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