Вы не можете изменять какие-либо функции массивов. JLS §10.7 Array Members определяет каждый член массива:
Члены типа массива все из следующих действий:
public
final
поле length
, который содержит число компонентов массива. length
может быть положительным или нулевым.
Метод public
clone
, который переопределяет метод с таким же именем в классе Object
и не отменяет проверенных исключений. Возвращаемым типом метода clone
типа массива T[]
является T[]
.
Клон многомерного массива неглубокий, то есть он создает только один новый массив. Subarrays разделяются.
Все наследуемые от класса Object
; единственным методом Object
, который не унаследован, является его метод clone
.
Спецификация не позволяет какой-либо способ настройки этой реализации. Например, метод массива toString()
всегда является основным, унаследованным от Object
.
Чтобы создать массив объекта компилятор генерирует один из трех инструкций в скомпилированный Java bytecode: newarray
для примитивов, anewarray
для ссылочных типов, или multinewarray
для всех многомерных массивов. При реализации этих инструкций виртуальная машина создает каждый класс массива по мере необходимости во время выполнения (JVMS §5.3.3 Creating Array Classes). ВМ также определяет специальные инструкции байт-кода для компилятора, которые будут использоваться для получения и установки элементов массивов и получения длины массива.
Как массивы, реализованные внутри виртуальной машины, не указаны вообще. Это чисто детализация реализации, и даже компилятор Java не знает или не заботится. Фактический задействованный код зависит от вкуса виртуальной машины, на которой запущена ваша программа, от версии этой виртуальной машины, ОС и процессора, на котором она работает, и любых соответствующих параметров времени выполнения, с которыми настроена виртуальная машина (например, в режиме интерпретации или нет).
быстрый взгляд поверх исходного кода OpenJDK 8 поворачивает вверх некоторые из соответствующих машин для массивов:
В массивах являются основной особенностью языка и виртуальной машины, что невозможно указать ни одного исходного файла и сказать «вот, это class Array
код». Массивы являются специальными, а техника, которая их реализует, буквально повсюду.
Если вы хотите настроить поведение массива, единственное, что вы можете сделать, это не использовать массив напрямую, а использовать, подкласс, или написать, класс коллекции, который внутри содержит массив. Это дает вам полную свободу определять поведение и характеристики класса. Тем не менее, невозможно сделать пользовательский класс be массивом в смысле языка Java. Это означает, что вы не можете заставить его реализовать оператор []
или быть приемлемым для метода, который ожидает массив.
Рассмотрите [исходный код] (http://hg.openjdk.java.net/) для JDK, чтобы узнать, как реализуются классы. –
Я не могу найти часть, которую я хочу прочитать. Вы можете мне помочь? – Gev
Он распространяется в разных местах файла jvm.cpp: http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/prims/jvm.cpp - есть также некоторые бит здесь: http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/oops/objArrayKlass.cpp – assylias