Сообщения

Сообщения за декабрь, 2020

Спецификация Java 11: 12.4. Инициализация классов и интерфейсов

Изображение
Инициализация класса состоит из выполнения его статических инициализаторов и инициализаторов для статических полей (переменных класса), объявленных в классе. Инициализация интерфейса заключается в выполнении инициализаторов для полей (констант), объявленных в интерфейсе. 12.4.1. Когда происходит инициализация Класс или тип интерфейса T будет инициализирован непосредственно перед первым появлением любого из следующих событий: T - это класс, и создается экземпляр T. Вызывается статический метод, объявленный T. Назначено статическое поле, объявленное T. Используется статическое поле, объявленное T, и поле не является постоянной переменной (§4.12.4). Когда класс инициализируется, инициализируются его суперклассы (если они не были ранее инициализированы), а также любые суперинтерфейсы (§8.1.5), которые объявляют любые методы по умолчанию (§9.4.3) (если они не были ранее инициализированы). Инициализация интерфейса сама по себе не вызывает инициализацию какого-либо из его суперинтер

Спецификация Java 11: 12.3. Связывание классов и интерфейсов

Изображение
Связывание - это процесс принятия двоичной формы типа класса или интерфейса и объединения его в состояние выполнения виртуальной машины Java, чтобы его можно было выполнить. Класс или тип интерфейса всегда загружаются до связывания. Связывание представлено тремя различными видами деятельности: проверка, подготовка и разрешение символических ссылок. Точная семантика связывания дана в главе 5 спецификации виртуальной машины Java, Java SE 11 Edition. Здесь мы представляем обзор процесса с точки зрения языка программирования Java. Эта спецификация обеспечивает гибкость реализации относительно того, когда происходит связывание действий (и, из-за рекурсии, загрузка), при условии, что соблюдается семантика языка программирования Java, что класс или интерфейс полностью проверены и подготовлены перед его инициализацией, и что ошибки, обнаруженные во время связывания, возникают в той точке программы, где программа выполняет какое-либо действие, которое может потребовать связывания с классом и

Спецификация Java 11: 12.2. Загрузка классов и интерфейсов

Изображение
Загрузка относится к процессу поиска двоичной формы класса или типа интерфейса с определенным именем, возможно, путем его вычисления на лету, но чаще путем извлечения двоичного представления, ранее вычисленного из исходного кода компилятором Java, и построения, из этой двоичной формы объект Class, представляющий класс или интерфейс. Точная семантика загрузки дана в главе 5 спецификации виртуальной машины Java, Java SE 11 Edition. Здесь мы представляем обзор процесса с точки зрения языка программирования Java. Двоичный формат класса или интерфейса обычно является форматом файла класса, описанным в спецификации виртуальной машины Java, Java SE 11 Edition, упомянутой выше, но возможны и другие форматы, при условии, что они соответствуют требованиям, указанным в §13.1. Метод defineClass класса ClassLoader может использоваться для создания объектов класса из двоичных представлений в формате файла class. Хорошо работающие загрузчики классов поддерживают следующие свойства: С таким же им

Спецификация Java 11: Глава 12. Исполнение

Изображение
В этой главе описываются действия, которые происходят во время выполнения программы. Она организована вокруг жизненного цикла виртуальной машины Java и классов, интерфейсов и объектов, образующих программу. Виртуальная машина Java запускается, загружая указанный класс или интерфейс, а затем вызывая метод main в этом указанном классе или интерфейсе. В разделе §12.1 описаны шаги загрузки, связывания и инициализации, связанные с выполнением main, в качестве введения в концепции этой главы. Дальнейшие разделы определяют детали загрузки (§12.2), связывания (§12.3) и инициализации (§12.4). Глава продолжается спецификацией процедур для создания новых экземпляров класса (§12.5); и завершение экземпляров класса (§12.6) . Она завершается описанием выгрузки классов (§12.7) и процедуры, выполняемой при выходе из программы (§12.8) . 12.1. Запуск виртуальной машины Java Виртуальная машина Java начинает выполнение, вызывая метод main определенного класса или интерфейса, передавая ему единственный

Спецификация Java 11: 11.3. Обработка исключения во время выполнения

Изображение
Когда генерируется исключение, управление передается от кода, вызвавшего исключение, ближайшему динамически включающему предложению catch, если таковое имеется, оператора try, который может обработать исключение. Оператор или выражение динамически включается в предложение catch, если оно появляется в блоке try оператора try, частью которого является предложение catch, или если вызывающий оператор или выражение динамически заключен в предложение catch. Вызывающий оператор или выражение зависит от того, где он встречается: Если внутри метода, то вызывающая сторона - это выражение вызова метода, которое было выполнено, чтобы вызвать вызов метода. Если внутри конструктора, или инициализатора экземпляра, или инициализатора для переменной экземпляра, то вызывающей стороной является выражение создания экземпляра класса или вызов метода newInstance, который был выполнен, чтобы вызвать создание объекта. Если внутри статического инициализатора или инициализатора для статической переменной,

Спецификация Java 11: 11.2.3. Проверка исключений

Изображение
Это ошибка времени компиляции, если тело метода или конструктора может вызвать некоторый класс исключения E, когда E является проверенным классом исключения, а E не является подклассом некоторого класса, объявленного в предложении throws метода или конструктора. Это ошибка времени компиляции, если тело лямбда может вызвать некоторый класс исключения E, когда E является проверенным классом исключения, а E не является подклассом некоторого класса, объявленного в предложении throws типа функции, на который нацелено лямбда-выражение. Это ошибка времени компиляции, если инициализатор переменной класса или статический инициализатор именованного класса или интерфейса может вызвать проверенный класс исключения. Это ошибка времени компиляции, если инициализатор переменной экземпляра или инициализатор экземпляра именованного класса может генерировать проверенный класс исключения, если только именованный класс не имеет хотя бы одного явно объявленного конструктора и класса исключения или один

Спецификация Java 11: 11.2.2. Анализ утверждений исключений

Изображение
Оператор throw, выброшенное выражение которого имеет статический тип E и не является окончательным (final) или фактически конечным (effectively final) параметром исключения, может вызывать E или любой класс исключения, который может вызвать выброшенное выражение. Например, оператор throw new java.io.FileNotFoundException(); может генерировать только java.io.FileNotFoundException. Формально это не тот случай, когда он "может генерировать" подкласс или суперкласс java.io.FileNotFoundException. Оператор throw, выброшенное выражение которого является конечным или фактически конечным параметром исключения в предложении catch C, может вызывать класс исключения E, если и только если: E - это класс исключения, который может выбросить блок try оператора try, который объявляет C; и E - это присваивание, совместимое с любым из перехватываемых классов исключений C; и E не совместим по присваиванию ни с одним из ловимых классов исключений в предложениях catch, объявленных слева от C

Спецификация Java 11: 11.2.1. Анализ исключений в выражениях

Изображение
Выражение создания экземпляра класса может вызвать исключение класса E, если: Выражение является квалифицированным выражением создания экземпляра класса, а квалифицирующее выражение может вызывать E; или же Некоторое выражение списка аргументов может вызывать E; или же E - один из типов исключений для типа вызова выбранного конструктора; или же Выражение создания экземпляра класса включает ClassBody, а некоторый инициализатор экземпляра или инициализатор переменной экземпляра в ClassBody может выдавать E. Выражение вызова метода может вызвать исключение класса E, если: Выражение вызова метода имеет форму Primary . [TypeArguments] Identifier и Primary выражение могут вызывать E; или же Некоторое выражение списка аргументов может вызывать E; или же E - это один из типов исключений для типа вызова выбранного метода. Лямбда-выражение не может генерировать классы исключений. Для любого другого вида выражения выражение может вызывать исключение класса E, если одно из его непос

Спецификация Java 11: 11.2. Проверка исключений во время компиляции

Изображение
Язык программирования Java требует, чтобы программа содержала обработчики проверенных исключений, которые могут возникнуть в результате выполнения метода или конструктора. Эта проверка во время компиляции на наличие обработчиков исключений предназначена для уменьшения количества исключений, которые не обрабатываются должным образом. Для каждого проверенного исключения, которое является возможным результатом, предложение throws для метода или конструктора должно упоминать класс этого исключения или один из суперклассов класса этого исключения. Проверенные классы исключений, указанные в предложении throws, являются частью контракта между разработчиком и пользователем метода или конструктора. Предложение throws переопределяющего метода может не указывать, что этот метод приведет к сбору любого проверенного исключения, которое переопределенному методу не разрешено с помощью его предложения throws. Когда задействованы интерфейсы, более одного объявления метода может быть переопределено одн

Спецификация Java 11: 11.1.3. Асинхронные исключения

Изображение
Большинство исключений возникают синхронно в результате действия потока, в котором они возникают, и в той точке программы, которая указана для возможного возникновения такого исключения. Асинхронное исключение, напротив, является исключением, которое потенциально может произойти в любой момент выполнения программы. Асинхронные исключения возникают только в результате: Вызов (устаревшего) метода stop класса Thread или ThreadGroup. Методы stop (устаревшие) могут быть вызваны одним потоком для воздействия на другой поток или все потоки в указанной группе потоков. Они асинхронны, потому что могут возникать в любой момент выполнения другого потока или потоков. Внутренняя ошибка или ограничение ресурсов в виртуальной машине Java, которые не позволяют ей реализовать семантику языка программирования Java. В этом случае вызываемое асинхронное исключение является экземпляром подкласса VirtualMachineError. Обратите внимание, что StackOverflowError, подкласс VirtualMachineError, может быть в

Спецификация Java 11: 11.1.2. Причины исключений

Изображение
Исключение создается по одной из трех причин: Оператор throw был выполнен. Виртуальная машина Java синхронно обнаружила ненормальное условие выполнения, а именно: оценка выражения нарушает нормальную семантику языка программирования Java, такую как целое деление на ноль. ошибка возникает при загрузке, связывании или инициализации части программы; в этом случае создается экземпляр подкласса LinkageError. внутренняя ошибка или ограничение ресурсов не позволяет виртуальной машине Java реализовать семантику языка программирования Java; в этом случае создается экземпляр подкласса VirtualMachineError. Эти исключения генерируются не в произвольной точке программы, а скорее в той точке, где они указаны как возможный результат оценки выражения или выполнения оператора. Произошло асинхронное исключение. Читайте также: Спецификация Java 11: Глава 11. Исключения Спецификация Java 11: 11.1. Виды и причины исключений Спецификация Java: пункт 12.7. Выгрузка классов и интерфейсов. 12

Спецификация Java 11: 11.1. Виды и причины исключений

Изображение
11.1.1. Виды исключений Исключение представляет экземпляр класса Throwable (прямой подкласс Object) или один из его подклассов. Throwable и все его подклассы вместе составляют классы исключений. Классы Exception и Error являются прямыми подклассами Throwable: Exception - это суперкласс всех исключений, из которых обычные программы могут захотеть восстановиться. Класс RuntimeException является прямым подклассом Exception. RuntimeException - это суперкласс всех исключений, которые могут быть вызваны по многим причинам во время оценки выражения, но восстановление из которых все еще возможно. RuntimeException и все его подклассы в совокупности являются классами исключений времени выполнения. Error - это суперкласс всех исключений, от которых обычно не ожидается восстановление обычных программ. Error и все ее подклассы вместе составляют классы ошибок. Непроверенные (unchecked) классы исключений - это классы исключений времени выполнения и классы ошибок. Проверенные (checked)

Спецификация Java 11: Глава 11. Исключения

Изображение
Когда программа нарушает семантические ограничения языка программирования Java, виртуальная машина Java сообщает об этой ошибке программе как об исключении. Примером такого нарушения является попытка индексации за пределами массива. Некоторые языки программирования и их реализации реагируют на такие ошибки, безоговорочно завершая программу; другие языки программирования позволяют реализации реагировать произвольным или непредсказуемым образом. Ни один из этих подходов несовместим с целями проектирования платформы Java SE: обеспечить переносимость и надежность. Вместо этого язык программирования Java указывает, что при нарушении семантических ограничений будет выдано исключение и вызовет нелокальную передачу управления из точки, где произошло исключение, в точку, которая может быть указана программистом. Считается, что исключение было выброшено из точки, где оно произошло, и считается, что оно было обнаружено в точке, в которую передается управление. Программы также могут явно генер

Спецификация Java: пункт 12.7. Выгрузка классов и интерфейсов. 12.8. Выход из программы

Изображение
12.7. Выгрузка классов и интерфейсов Реализация языка программирования Java может выгружать классы. Класс или интерфейс могут быть выгружены тогда и только тогда, когда его определяющий загрузчик классов может быть восстановлен сборщиком мусора. Классы и интерфейсы, загруженные загрузчиком начальной загрузки, не могут быть выгружены. Выгрузка классов - это оптимизация, которая помогает уменьшить использование памяти. Очевидно, что семантика программы не должна зависеть от того, решит ли система реализовать оптимизацию, такую как выгрузка классов, и каким образом. В противном случае была бы нарушена переносимость программ. Следовательно, независимо от того, был ли выгружен класс или интерфейс, должно быть прозрачно для программы. Однако, если класс или интерфейс C был выгружен, в то время как его определяющий загрузчик был потенциально доступен, то C может быть перезагружен. Никогда нельзя было гарантировать, что этого не произойдет. Даже если на класс не ссылается какой-либо дру

Спецификация Java: пункт 12.6.2. Финализация объектов. Взаимодействие с моделью памяти

Изображение
Модель памяти должна иметь возможность решать, когда она может фиксировать действия, выполняемые в финализаторе. В этом разделе описывается взаимодействие финализации с моделью памяти. У каждого выполнения есть несколько точек принятия решения о достижимости (decision points), обозначенных как di. Каждое действие идет либо до di (comes-before), либо после di (comes-after). За исключением явно указанного, упорядочение "предшествует" (comes-before), описанное в этом разделе, не связано со всеми другими порядками в модели памяти. Если r - это чтение, при котором запись w и r предшествует di, то w должно предшествовать di. Если x и y являются действиями синхронизации для одной и той же переменной или монитора, так что so(x, y) и y предшествует di, то x должен предшествовать di. В каждой точке принятия решения о достижимости некоторый набор объектов помечается как недостижимый, а некоторое подмножество этих объектов помечается как финализируемое. Эти точки принятия решения о д

Спецификация Java: пункт 12.6.1. Реализация финализации

Изображение
Каждый объект может быть охарактеризован двумя атрибутами: он может быть доступен, доступен для финализатора или недоступен, а также может быть нефинализируемым, финализируемым или финализированным. Доступный объект - это любой объект, к которому можно получить доступ в любом потенциальном продолжающемся вычислении из любого живого потока. Доступный для финализатора объект может быть достигнут из некоторого финализируемого объекта через некоторую цепочку ссылок, но не из любого живого потока. Ни одним из способов добраться до недоступного объекта нельзя. Для нефинализированного объекта финализатор никогда не вызывался автоматически. У финализированного объекта был автоматически вызван финализатор. У финализируемого объекта никогда не было автоматического вызова финализатора, но виртуальная машина Java может в конечном итоге автоматически вызвать его финализатор. Объект o не может быть финализирован до тех пор, пока его конструктор не вызовет конструктор для Object на o и этот

Спецификация Java: пункт 12.6. Финализация экземпляров классов

Изображение
У класса Object есть защищенный метод под названием finalize; этот метод может быть переопределен другими классами. Конкретное определение finalize, которое может быть вызвано для объекта, называется финализатором (finalizer) этого объекта. Прежде чем хранилище для объекта будет освобождено сборщиком мусора, виртуальная машина Java вызовет финализатор этого объекта. Финализаторы предоставляют возможность освободить ресурсы, которые не могут быть освобождены автоматически автоматическим диспетчером хранения. В таких ситуациях простое освобождение памяти, используемой объектом, не гарантирует, что ресурсы, которые он удерживает, будут освобождены. В языке программирования Java не указывается, как скоро будет вызван финализатор, за исключением того, что это произойдет до того, как хранилище для объекта будет повторно использовано. В языке программирования Java не указывается, какой поток будет вызывать финализатор для любого данного объекта. Важно отметить, что многие потоки финализат

Метод clone и интерфейс Cloneable в Java

Изображение
Метод clone() класса Object protected native Object clone() throws CloneNotSupportedException; Интерфейс Cloneable public interface Cloneable {} Общий контракт для метода clone Метод clone создает и возвращает копию этого объекта. Точное значение слова "копия" может зависеть от класса объекта. Общее намерение состоит в том, чтобы для любого объекта x выражение x.clone() != x будет true, и выражение x.clone().getClass() == x.getClass() будет true, но это не абсолютные требования. Хотя обычно x.clone().equals(x) будет true, это не абсолютное требование. Копирование объекта обычно влечет за собой создание нового экземпляра его класса, но также может потребоваться копирование внутренних структур данных. Никакие конструкторы не вызываются. Если вы переопределите метод clone в нефинальном классе, вы должны вернуть объект, полученный с помощью вызова super.clone() Методы super.clone() автоматически копируют примитивные значения На практике о

Функциональные интерфейсы в Java

Изображение
Функциональные интерфейсы предоставляют целевые типы для лямбда-выражений и ссылок на методы. Каждый функциональный интерфейс имеет один абстрактный метод, называемый функциональным методом для этого функционального интерфейса, к которому сопоставляются или адаптируются параметры лямбда-выражения и возвращаемые типы. Функциональные интерфейсы могут предоставлять целевой тип в нескольких контекстах, таких как контекст присвоения, контекст вызова метода или контекст приведения: // Контекст присвоения Predicate<String> p = String::isEmpty; // Контекст вызова метода stream.filter(e -> e.getSize() > 10)... // Контекста приведения stream.map((ToIntFunction) e -> e.getSize())... Интерфейсы в пакете java.util.function являются функциональными интерфейсами общего назначения, используемыми JDK, а также доступны для использования в пользовательском коде. Хотя они не определяют полный набор форм функций, к которым могут быть адаптированы лямбда-выражения, они предоставляют