Комментарии 8
Массивом называется структура данных, хранящая последовательность из заданного количества однотипных элементов.
Отличная статья ! В свое время помогла разобраться с пониманием работы массива. Возможно также стоит упомянуть про класс Arrays, в частности как работает Arrays.copyOf().
переменные массивов хранят не сам массив, а ссылку на него, которая, в свою очередь, указывает на начало области памяти, содержащую его значения.
Нууу, это не так, причём вы сами же дальше пишите, что массив - это не просто область памяти, а именно объект, с набором присущих объекту полей и методов.
сошлюсь на документацию, в которой написано: «Длина массива не является частью его типа». Значит length не хранится в ассоциируемом классе!
Реально запутали, а где именно в документации такое? Потому, что я вижу другое (jls 10.7):
Array Members
The members of an array type are all of the following:
The public final field length, which contains the number of components of the array. length may be positive or zero.
данный класс неявно наследуется от java.lang.Object, что делает доступным все его методы (кроме clone()) и интерфейсы Cloneable и Serializable
Тоже странное утверждение. Как вы представляете себе объект, реализующий интерфейс Cloneable с недоступным методом clone()? Конечно же, метод clone() доступен и массивы прекрасно клонируются. См в jls: Example 10.7-1. Arrays Are Cloneable
Спасибо за конструктивную критику и желание разобраться!
Нууу, это не так, причём вы сами же дальше пишите, что массив - это не просто область памяти, а именно объект, с набором присущих объекту полей и методов.
да, new возвращает ссылку на объект.
Реально запутали, а где именно в документации такое? Потому, что я вижу другое (jls 10.7):
Array Members
The members of an array type are all of the following:
The public final field length, which contains the number of components of the array. length may be positive or zero.
Об этом написано в 10.1. Array Types: An array's length is not part of its type. (ссылка в статье как раз ведет на данное утверждение в спеке).
Что касается пункта 10.7 и приведенного там класса, который якобы описывает массив, то про него можно сказать, что это всего лишь иллюстрация в виде псевдокода, показывающая, как реализация массива могла бы выглядеть в синтаксисе Java. То, что это не реальный класс говорит текст после него: Note that the cast in the example above would generate an unchecked warning (§5.1.9) if arrays were really implemented this way.
Поле length находится в хедере объекта:
что подтверждается выводом JOL, который приводится в статье
об этом говорит Алексей Шипилев в своем видео
Тоже странное утверждение. Как вы представляете себе объект, реализующий интерфейс Cloneable с недоступным методом clone()? Конечно же, метод clone() доступен и массивы прекрасно клонируются. См в jls: Example 10.7-1. Arrays Are Cloneable
уточнил в тексте, что не сам метод clone() недоступен, а его не отображает метод getMethods(), т. к. он возвращает только public-методы. А clone() - protected.
уточнил в тексте, что не сам метод clone() недоступен, а его не отображает метод getMethods(), т. к. он возвращает только public-методы. А clone() - protected.
Это тоже не совсем верно. Если бы он был protected, то его нельзя было бы вызывать, поэтому, он обязан быть public. Интересно, что Idea в подсказке его показывает пабликом. Но рефлексией его не получить, кажется, никак (ну, то есть если переопределить для обычных классов, то, конечно, можно, а так - нэт). Тоже какой-то внутренний хак, как с полем length :)
В классе Object метод clone() является protected. Именно его и не отображает метод getMethods(), т.к. заточен на вывод только public-методов. А у массивов данный метод реализован (переопределен, как написано в документации: 10.7. The public method clone, which overrides the method of the same name in class Object) как public. Тут происходит расширение области видимости с protected до public.
А у массивов данный метод реализован (переопределен, как написано в документации: 10.7. The public method clone, which overrides the method of the same name in class Object) как public. Тут происходит расширение области видимости с protected до public.
Да как это должно работать понятно. Но в реале метод clone через рефлексию от массива не получить. Если бы он действительно был перегружен, его можно было бы получить через какой-нибудь из get(Declared)Method(s) - а не получается.
Исчерпывающее руководство по одномерным массивам в Java