В Java мы можем объявить массив, используя следующее:
String[] array = new String[10];
int size = array.length;
Означает ли это, что сам массив является объектом? Я спрашиваю, потому что в C ++ массив - это просто указатель и не имеет никаких методов.
if (array instanceof Object) System.out.println("Yes!")
&x
,p+i
иnew int(42)
.Ответы:
Да.
Раздел 4.3.1 спецификации языка Java начинается с:
источник
Да; Спецификация языка 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
источник
int[] someIntegers = {42};
, к тому же результату.Да, это объект на Java.
Также обратите внимание, что когда вы это
array.length
делаете, вы не вызываете никаких методов, а просто получаете доступ кlength
полю массива . В классе Arrays есть множество статических методов .источник
Важно отметить, что массивы в Java имеют свои собственные байтовые коды, которые они не разделяют с объектами. Это определенно объекты, но на низком уровне они обрабатываются немного иначе.
источник
Я бы сказал, что да, хотя я мог бы добавить, что, строго говоря, массив также является объектом в C ++. Из §1.8 [intro.object] текущего стандарта (FDIS):
источник
Я просто хочу добавить, что массивы имеют представление в API отражения - java.lang.reflect.Array .
источник
Каждый массив в java - это объект ex int [] a = new int [2]; Итак, new используется для создания объекта, и поскольку это объект, мы можем проверить имя класса, просто используя 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
8b. Для
java.lang.Class<T>
каждого типа массива в вашем коде создается уникальный экземпляр класса отражения (т.е. экземпляр ). Примерыint[].class.getCanonicalName() // -> "int[]" String[].class.getCanonicalName() // -> "java.lang.String[]" /
ССЫЛКИ
Из спецификации Java Раздел 4.3.1 Объекты
Объект - это экземпляр класса или массив.
Экземпляр класса явно создается выражением создания экземпляра класса.
Массив явно создается выражением создания массива.
Из java.util.Arrays
Из java.lang.reflect.Array
Из Раздела 10.1 Объекты
Прямой суперкласс типа массива
Object
.Каждый тип массива реализует интерфейсы
Cloneable
иjava.io.Serializable
.Из Раздела 10.7 Члены массива
Члены типа массива следующие:
Открытое финальное поле
length
, которое содержит количество компонентов массива. длина может быть положительной или нулевой.Открытый метод
clone
, который переопределяет одноименный метод в классеObject
и не генерирует проверенных исключений. Тип возвращаемого значенияclone
метода типа массиваT[]
-T[]
.Клон многомерного массива неглубокий, то есть он создает только один новый массив. Подмассивы являются общими.
Все члены унаследованы от класса Object; единственный метод Object, который не наследуется, - это его метод clone.
источник
Массивы чего угодно - это объекты. Можно вызывать такие методы, как
equals
иhashcode
т. Д.:final int[] i = {}; i.equals(new int[] {1}); // false i.hashcode();
Нельзя вызывать методы для собственного типа.
источник
Обратите внимание на фрагмент кода и вывод.
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 рассматривается как объект.
источник
Да, в документации так сказано:
Обратите внимание, что типы массивов примитивных типов (например,
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[]
.источник