Являются ли массивы в Java примитивным типом данных?

Ответ

Нет, массивы в Java — это не примитивы, а объекты. Они являются объектами специального типа, создаваемыми во время выполнения.

Доказательства того, что массивы — это объекты:

  1. Наследование от Object: Все массивы неявно наследуют класс java.lang.Object.

    int[] intArray = new int[5];
    System.out.println(intArray instanceof Object); // true
  2. Наличие методов класса Object: К массиву можно применять методы toString(), hashCode(), clone().

    String[] strArray = {"a", "b"};
    System.out.println(strArray.toString()); // Вызовется Object.toString()
  3. Поле length: Это не метод, а финальное публичное поле, характерное для объектов-массивов.

    System.out.println(intArray.length); // 5
  4. Приведение типов: Массивы участвуют в иерархии ссылочных типов.

    Object obj = new int[10]; // Массив может быть присвоен переменной типа Object
    String[] strings = (String[]) obj; // Возможно приведение (выбросит ClassCastException в этом случае)

Отличия от примитивов:

  • Примитивы (int, char и т.д.) не являются объектами, не имеют методов и не наследуют Object.
  • Массив хранит свои элементы (примитивы или ссылки) в непрерывной области памяти, но сама переменная массива — это ссылка на этот объект в куче (heap).

Синтаксис создания: new int[5] — ключевое слово new используется для создания объектов, что также подтверждает природу массивов.

Ответ 18+ 🔞

А, ну вот, опять про массивы в Java заговорили! Давайте, блядь, раз и навсегда расставим точки над ё, чтобы потом не было этих ебушки-воробушки с "а я думал, это примитив".

Смотрите сюда, товарищи программисты. Если кто-то вам скажет, что массив в Java — это примитив, вы ему прямо в ебало этим кодом кидайтесь. Это объект, ёпта! Самый настоящий, хоть и со своей спецификой. Создаётся он в рантайме, живёт в куче, как все порядочные объекты.

А вот вам железобетонные доказательства, что это не какая-нибудь хитрая жопа, а полноценный объект:

  1. Он от Object родился, блядь! Все массивы, хоть целочисленные, хоть строковые, — они неявно от великого и ужасного java.lang.Object происходят. Проверяем — не верите?

    int[] intArray = new int[5];
    System.out.println(intArray instanceof Object); // true

    Видите? true! Сам instanceof кричит: "Да, папаша, это твой сын, объектный!"

  2. Методы Object у него работают! Попробуйте к примитиву int вызвать toString() — получите по ебалу ошибкой компиляции. А с массивом — пожалуйста, вызывается родной Object.toString().

    String[] strArray = {"a", "b"};
    System.out.println(strArray.toString()); // Вызовется Object.toString()

    И hashCode(), и clone() — всё наше, объектное.

  3. Поле length — это вам не метод какой-нибудь! Это финальное публичное поле, вишенка на торте объекта-массива. У примитивов полей нет и быть не может, это же просто голые битики.

    System.out.println(intArray.length); // 5
  4. Приведение типов — царь доказательств! Массивы в иерархии ссылочных типов плавают, как рыба в воде. Можете запихнуть массив в переменную типа Object — и он там будет сидеть, довольный.

    Object obj = new int[10]; // Массив может быть присвоен переменной типа Object
    String[] strings = (String[]) obj; // Возможно приведение (выбросит ClassCastException в этом случае)

    А теперь попробуйте примитив int в Object запихнуть без обёртки Integer — получите волнение ебать и красные подчёркивания в IDE.

Чем он не похож на примитивы, спросите вы? Да всем, блядь! Примитив — это тупая, прости господи, величина в стеке. Ни методов, ни папы Object, ни наследников. А массив — это ссылка (переменная), которая тычет пальцем в область в куче, где лежат его элементы (хоть примитивы, хоть другие ссылки). Ключевое слово new при создании — это же священный ритал порождения объекта! new int[5] — что может быть очевиднее?

Так что запомните: массив — объект. Всё, тема закрыта, можно расходиться.