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

94

В Java мы можем объявить массив, используя следующее:

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

Означает ли это, что сам массив является объектом? Я спрашиваю, потому что в C ++ массив - это просто указатель и не имеет никаких методов.

Майк Джи
источник
5
Нет, в C ++ массив - это массив, а не массив.
Kerrek SB 08
42
if (array instanceof Object) System.out.println("Yes!")
skaffman 08
6
Да, и в C ++ и массивы, и указатели являются объектами.
R. Martinho Fernandes
2
@ R.MartinhoFernandes Все массивы C ++ действительно являются объектами C ++, но есть указатели C ++, которые не являются объектами C ++, а именно все указатели, которые являются результатом вычисления rvalue. Примеры включают &x, p+iи new int(42).
fredoverflow 08
1
@skaffman Сообщение не является строго необходимым, иначе оно не компилируется.
shmosel 08

Ответы:

198

Да.

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

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

Павел
источник
4
До сих пор я всегда предполагал, что объект является синонимом экземпляра класса, а массивы - это особенность языка или что-то в этом роде.
Ruben9922
Подробное объяснение дано здесь: geeksforgeeks.org/array-primitive-type-object-java
гранат
60

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

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

меритон
источник
Если массив является объектом, разве это не означает, что это экземпляр класса? Если да, могу ли я расширить этот класс?
One Two Three
9
Нет, это не так: спецификация Java пишет : «Объект - это экземпляр класса или массив. Экземпляр класса явно создается выражением создания экземпляра класса (§15.9). Массив явно создается выражением создания массива (§15.10). ". И нет, вы не можете расширить массив, потому что предложение extends должно содержать ClassType.
meriton 03
36

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

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
Насуккин
источник
1
Вы также можете объявить int[] someIntegers = {42};, к тому же результату.
Хольгер
7

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

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

Марселлус Уоллес
источник
3

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

ed209
источник
2

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

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

Бьорн Поллекс
источник
1

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

Манодж Моханти
источник
1
  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

8b. Для 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, который не наследуется, - это его метод clone.

RFS
источник
1

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

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

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

fastcodejava
источник
0

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

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 рассматривается как объект.

Вишну Дахатонда
источник
0

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

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

Обратите внимание, что типы массивов примитивных типов (например, 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[].
MC Император
источник