Является ли массив объектом в Java

В Java мы можем объявить массив как

String[] array = new String[10]; 
int size = array.length; 

Значит ли это, что сам массив является объектом? Потому что в C++ массив является просто указателем и не имеет никаких методов.

14 ответов

Решение

Да.

Раздел 4.3.1 Спецификации языка Java начинается с:

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

Да; Спецификация языка Java пишет:

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

Что ж, давайте спросим Java!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Выход:

true
true

Да, это объект в Java.

Также обратите внимание, что когда вы делаете array.length вы не вызываете какие-либо методы, а просто обращаетесь к массиву length поле. В классе Arrays есть много статических методов.

  1. Массив не является экземпляром какого-либо класса, указанного в дереве классов, однако каждый массив является объектом и наследуется непосредственно от java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Класс java.util.Arrays является вспомогательным классом, и массивы не являются экземплярами этого класса.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Класс java.lang.reflect.Array является вспомогательным классом, и массивы не являются экземплярами этого класса.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Массивы наследуют все члены java.lang.Object

  2. Массивы переопределяют метод clone() унаследованный от Object,

  3. Массивы реализуют поле length, который содержит количество компонентов массива. длина может быть положительной или нулевой. это public а также final,

  4. Массивы реализуют интерфейсы Cloneable а также java.io.Serializable,

8а. Массивы поддерживаются Class<T>, Вы можете получить Class<T> экземпляр из экземпляра массива

(new int[2]).getClass()

или из типа массива

int[].class

8б. Уникальный экземпляр класса отражения (т.е. экземпляр java.lang.Class<T>) создается для каждого типа массива в вашем коде. Примеры

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Повторим: массивы являются объектами, но не являются экземплярами какого-либо класса в дереве классов.

РЕКОМЕНДАЦИИ

Из спецификации Java Раздел 4.3.1 Объекты

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

  • Экземпляр класса явно создается выражением создания экземпляра класса.

  • Массив явно создается выражением создания массива.

Из java.util.Arrays

  • Этот класс содержит различные методы для манипулирования массивами (такие как сортировка и поиск)

От java.lang.reflect.Array

  • Класс Array предоставляет статические методы для динамического создания и доступа к массивам Java.

Из раздела 10.1 Объекты

  • Прямой суперкласс типа массива Object ,

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

Из раздела 10.7 Члены массива

Членами типа массива являются все следующие:

  • Публичное финальное поле length , который содержит количество компонентов массива. длина может быть положительной или нулевой.

  • Публичный метод clone , который переопределяет метод с тем же именем в классе Object и не выбрасывает никаких проверенных исключений. Тип возвращаемого значения clone метод типа массива T[] является T[] ,

  • Клон многомерного массива неглубокий, то есть он создает только один новый массив. Подмассивы являются общими.

  • Все члены унаследованы от класса Object; единственный метод Object, который не наследуется, это его метод клонирования.

Важно отметить, что массивы в Java имеют свои собственные байтовые коды, которые они не разделяют с объектами. Они, безусловно, являются объектами, но на низком уровне обрабатываются немного по-другому.

Я просто хочу добавить, что массивы имеют представление в API отражения - java.lang.reflect.Array.

Я бы сказал, что ответ - да, хотя я мог бы добавить, что, строго говоря, массив также является объектом в C++. Из §1.8 [intro.object] текущего стандарта (FDIS):

Объект - это область хранения.

Массивы чего угодно - это объекты. Можно вызвать такие методы, какequals, hashcode так далее:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Нельзя вызывать методы для собственного типа.

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

Каждый массив в Java является объектом ex int[] a=new int [2]; Таким образом, new используется для создания объекта, и поскольку он является объектом, мы можем проверить имя класса, просто используя a.getClass(). GetName();

Да, в документации так сказано:

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

Обратите внимание, что типы массивов примитивных типов (например, int[] или же char[]) сами по себе тоже являются объектами.

Каждый массив напрямую расширяется java.lang.Object и реализует интерфейсы javs.lang.Cloneable и java.io.Serializable. Сигнатура типа среды выполнения для массива: [L сразу после имени класса типа компонента (например, [Ljava.lang.String). Массивы примитивных типов имеют следующую сигнатуру времени выполнения:

  • [B за byte[];
  • [S за short[];
  • [I за int[];
  • [J за long[];
  • [F за float[];
  • [D за double[];
  • [C за char[].

Некоторые предлагали проверять значение, возвращаемое экземпляром. Я думаю, что этот способ семантически неверен, потому что, как только вы сможете написать и скомпилировать такой код:

          int[] myArray = new int[3];
    if (myArray instanceof Object) {
    }

Уже доказано, что myArray - это объект. В противном случае код не компилируется. Как написано в учебнике оракула

Оператор instanceof сравнивает объект с указанным типом. Вы можете использовать его, чтобы проверить, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

Обратите внимание на фрагмент кода и вывод.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

очевидно, что массив a рассматривается как объект.

Другие вопросы по тегам