Является ли массив объектом в 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 есть много статических методов.
- Массив не является экземпляром какого-либо класса, указанного в дереве классов, однако каждый массив является объектом и наследуется непосредственно от
java.util.Object
(new int[1]) instanceof Object // -> evaluates to true
- Класс
java.util.Arrays
является вспомогательным классом, и массивы не являются экземплярами этого класса.
(new int[1]) instanceof java.util.Arrays // -> compile error
- Класс
java.lang.reflect.Array
является вспомогательным классом, и массивы не являются экземплярами этого класса.
(new int[1]) instanceof java.lang.reflect.Array // -> compile error
Массивы наследуют все члены
java.lang.Object
Массивы переопределяют метод
clone()
унаследованный отObject
,Массивы реализуют поле
length
, который содержит количество компонентов массива. длина может быть положительной или нулевой. этоpublic
а такжеfinal
,Массивы реализуют интерфейсы
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[]" /
- Повторим: массивы являются объектами, но не являются экземплярами какого-либо класса в дереве классов.
РЕКОМЕНДАЦИИ
Из спецификации Java Раздел 4.3.1 Объекты
Объект является экземпляром класса или массивом.
Экземпляр класса явно создается выражением создания экземпляра класса.
Массив явно создается выражением создания массива.
- Этот класс содержит различные методы для манипулирования массивами (такие как сортировка и поиск)
- Класс Array предоставляет статические методы для динамического создания и доступа к массивам Java.
Прямой суперкласс типа массива
Object
,Каждый тип массива реализует интерфейсы
Cloneable
а такжеjava.io.Serializable
,
Членами типа массива являются все следующие:
Публичное финальное поле
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 рассматривается как объект.