В java мы можем объявить массив вроде
String[] array = new String[10];
int size = array.length;
Означает ли это, что сам массив является объектом? Поскольку в С++ массив является всего лишь указателем и не имеет каких-либо методов.
В java мы можем объявить массив вроде
String[] array = new String[10];
int size = array.length;
Означает ли это, что сам массив является объектом? Поскольку в С++ массив является всего лишь указателем и не имеет каких-либо методов.
Да.
Спецификация языка Java раздел 4.3.1 начинается с:
Объект - это экземпляр класса или массив.
Да; Спецификация языка Java пишет:
На языке программирования Java массивы являются объектами (§4.3.1), динамически создаются и могут быть назначены переменным типа Object (§ 4.3.3). Все методы класса 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 имеют свои собственные байтовые коды, которые они не разделяют с объектами. Они, конечно, являются объектами, но обрабатываются немного по-другому на низком уровне.
Я бы сказал, что ответ да, хотя я мог бы добавить, что, строго говоря, массив также является объектом на С++. Из § 1.8 [intro.object] текущего стандарта (FDIS):
Объект - это область хранения.
Я просто хочу добавить, что массивы имеют представление в API отражения - java.lang.reflect.Array.
Каждый массив в java является объектом ex int [] a = новый int [2]; Поэтому для создания объекта используется новый, и поскольку он является объектом, мы можем проверить имя класса, просто используя a.getClass(). GetName();
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 Объекты
Объект является экземпляром класса или массивом.
Экземпляр класса явно создается выражением создания экземпляра класса.
Массив явно создается выражением создания массива.
Прямой суперкласс типа массива - Object
.
Каждый тип массива реализует интерфейсы Cloneable
и java.io.Serializable
.
Членами типа массива являются все следующие:
Публичная конечная length
поля, которая содержит количество компонентов массива. длина может быть положительной или нулевой.
Открытый метод clone
, который переопределяет метод с тем же именем в классе Object
и не выдает никаких проверенных исключений. Тип возврата метода clone
типа массива T[]
- T[]
.
Клон многомерного массива неглубокий, то есть он создает только один новый массив. Подмассивы являются общими.
Все члены унаследованы от класса Object; единственный метод Object, который не наследуется, это его метод клонирования.
Обратите внимание на фрагмент кода и вывод.
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 рассматривается как объект.