Java: различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Dakumah (обсуждение | вклад) м Дополнил, что не следует путать с другим языком. |
Спасено источников — 2, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.9.5 |
||
(не показаны 204 промежуточные версии, сделанные более чем 100 участниками) | |||
Строка 1: | Строка 1: | ||
{{Карточка языка программирования | логотип = Java logo.svg}} |
|||
{{о|языке программирования|прикладной платформе на основе данного языка|Java (программная платформа)}} |
{{о|языке программирования|прикладной платформе на основе данного языка|Java (программная платформа)}} |
||
{{не путать|JavaScript}} |
{{не путать|JavaScript}} |
||
{{Карточка языка программирования |
|||
'''Java'''<ref group="прим.">Произносится на английском как {{IPA|/ˈdʒɑːvə/}}, в русском языке встречаются транслитерации «Джава» и «Ява», правообладатели торговой марки предпочитают первую транслитерацию.</ref> — [[сильная и слабая типизация|строго]] [[статическая типизация|типизированный]] [[объектно-ориентированный язык программирования]] общего назначения, разработанный компанией [[Sun Microsystems]] (в последующем приобретённой компанией [[Oracle]]). Разработка ведётся сообществом, организованным через [[Java Community Process]]; язык и основные реализующие его технологии распространяются по лицензии [[GPL]]. Права на торговую марку принадлежат корпорации Oracle. |
|||
| логотип = [[Файл:Java logo.svg|121px]] |
|||
| класс = [[Java Virtual Machine#Среда исполнения|язык JVM]], [[мультипарадигменный язык программирования|мультипарадигменный]]: [[объектно-ориентированное программирование|объектно-ориентированный]], |
|||
[[аспектно-ориентированное программирование|аспектно-ориентированный]], |
|||
[[обобщённое программирование|обобщённый]], [[Отражение (программирование)|рефлективный]] |
|||
| расширение = .java, .class, [[JAR|.jar]], .jad, .jmod, [[WAR (тип файла)|.war]], [[EAR|.ear]] |
|||
| последняя версия = Java SE 23<ref>{{Cite web|title=JDK 23 Release Notes|url=https://www.oracle.com/java/technologies/javase/23all-relnotes.html|access-date=2024-09-27|archive-date=2024-09-27|archive-url=https://web.archive.org/web/20240927152113/https://www.oracle.com/java/technologies/javase/23all-relnotes.html|url-status=live}}</ref> |
|||
| дата выпуска последней версии = 17.09.2024 |
|||
| повлиял на = [[Ада (язык программирования)|Ada]], [[C Sharp|C#]], [[Chapel (язык программирования)|Chapel]], [[Clojure]], [[ECMAScript]], [[Fantom]], [[Gambas]], [[Groovy]], [[Hack (язык программирования)|Hack]], [[Haxe]], [[Visual J Sharp|J#]], [[Kotlin]], [[PHP]], [[Python]], [[Scala (язык программирования)|Scala]], [[Seed7]], [[Vala]], [[JavaScript]] |
|||
| сайт = https://www.oracle.com/ru/java/ |
|||
| Последняя версия = Java SE 21 |
|||
}} |
|||
'''Java'''<ref group="прим.">Произносится на английском как {{IPA|/ˈdʒɑːvə/}}, "Джава". В русском языке помимо «Джава» встречается транслитерация «Ява», но правообладатели торговой марки предпочитают первую транслитерацию.</ref> — [[сильная и слабая типизация|строго]] [[статическая типизация|типизированный]] [[объектно-ориентированный язык программирования]] общего назначения, разработанный компанией [[Sun Microsystems]] (в последующем приобретённой компанией [[Oracle]]). Разработка ведётся сообществом, организованным через [[Java Community Process]]; язык и основные реализующие его технологии распространяются по лицензии [[GPL]]. Права на [[Торговая марка|торговую марку]] принадлежат корпорации [[Oracle]]. |
|||
Приложения Java обычно [[транслятор|транслируются]] в специальный [[байт-код]], поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация [[Java Virtual Machine|виртуальной Java-машины]] |
Приложения Java обычно [[транслятор|транслируются]] в специальный [[байт-код]], поэтому они могут работать на любой [[Компьютерная архитектура|компьютерной архитектуре]], для которой существует реализация [[Java Virtual Machine|виртуальной Java-машины]]. Дата официального выпуска — 23 мая 1995 года. Java занимает высокие места в рейтингах популярности языков программирования (2-е место в рейтингах [[IEEE Spectrum]] (2020)<ref>{{Cite news|title=Top Programming Languages 2020|url=https://spectrum.ieee.org/at-work/tech-careers/top-programming-language-2020|work=IEEE Spectrum|access-date=2021-02-14|language=en|archive-date=2021-01-18|archive-url=https://web.archive.org/web/20210118190122/https://spectrum.ieee.org/at-work/tech-careers/top-programming-language-2020}}</ref> и [[Индекс TIOBE|TIOBE]] (2021<ref>{{Cite web|url=https://www.tiobe.com/tiobe-index/|title=TIOBE Index {{!}} TIOBE — The Software Quality Company|publisher=www.tiobe.com|accessdate=2018-11-19|archive-date=2018-02-25|archive-url=https://web.archive.org/web/20180225101948/https://www.tiobe.com/tiobe-index/|deadlink=no}}</ref>). |
||
== История создания == |
== История создания == |
||
[[Файл:James Gosling 2008.jpg|thumb|[[Гослинг, Джеймс|Джеймс Гослинг]]]] |
|||
Изначально язык назывался Oak («Дуб»), разрабатывался [[Гослинг, Джеймс|Джеймсом Гослингом]] для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java<ref>{{Книга|автор=Buyya|заглавие=Object-oriented Programming with Java: Essentials and Applications|ссылка=https://books.google.ru/books?id=rXGMFYXFDwMC&pg=PA34&dq=James+gosling+oak&hl=ru&sa=X&ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA#v=onepage&q=James%20gosling%20oak&f=false|издательство=Tata McGraw-Hill Education|год=2009|страниц=678|isbn=9780070669086}}</ref>. Назван в честь марки [[кофе]] Java, которая, в свою очередь, получила наименование одноимённого острова ([[Ява]]), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с [[Аллюзия|аллюзией]] на кофе-машину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось. |
|||
Изначально язык назывался Oak («Дуб»), разрабатывался [[Гослинг, Джеймс|Джеймсом Гослингом]] для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java<ref>{{Книга|автор=Buyya|заглавие=Object-oriented Programming with Java: Essentials and Applications|ссылка=https://books.google.ru/books?id=rXGMFYXFDwMC&pg=PA34&dq=James+gosling+oak&hl=ru&sa=X&ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA|издательство=Tata McGraw-Hill Education|год=2009|страниц=678|isbn=9780070669086|access-date=2018-11-12|archive-date=2018-11-12|archive-url=https://web.archive.org/web/20181112101707/https://books.google.ru/books?id=rXGMFYXFDwMC&pg=PA34&dq=James+gosling+oak&hl=ru&sa=X&ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA#v=onepage&q=James%20gosling%20oak&f=false|url-status=live|archive-date=2018-11-12|archive-url=https://web.archive.org/web/20181112101707/https://books.google.ru/books?id=rXGMFYXFDwMC&pg=PA34&dq=James+gosling+oak&hl=ru&sa=X&ved=0ahUKEwiB9PfT-s3eAhXMqIsKHSC7BIkQ6AEILDAA#v=onepage&q=James%20gosling%20oak&f=false}}</ref>. Назван в честь марки [[кофе]] Java, которая, в свою очередь, получила наименование одноимённого острова ([[Ява]]), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с [[Аллюзия|аллюзией]] на кофемашину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось. |
|||
В результате работы проекта мир увидел принципиально новое устройство, [[ |
В результате работы проекта мир увидел принципиально новое устройство, [[карманный персональный компьютер]] Star7<ref>{{Cite web |url=https://temofeev.ru/info/articles/star7-s-chego-nachinalas-java/ |title=Star7: с чего начиналась Java |access-date=2022-10-02 |archive-date=2022-10-02 |archive-url=https://web.archive.org/web/20221002075116/https://temofeev.ru/info/articles/star7-s-chego-nachinalas-java/ |deadlink=no }}</ref>, который опередил своё время более чем на 10 лет, но из-за большой стоимости в 50 долларов не смог произвести переворот в мире технологии и был забыт. |
||
Устройство Star7 не пользовалось популярностью в отличие от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. |
Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. Однако в 1994 году стало очевидным, что интерактивное телевидение было ошибкой. |
||
С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и [[Сервер (программное обеспечение)|серверного]] программного обеспечения. Тогда же определённое распространение получила технология [[Java-апплет]]ов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко. |
С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и [[Сервер (программное обеспечение)|серверного]] программного обеспечения. Тогда же определённое распространение получила технология [[Java-апплет]]ов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей [[Динамический сайт|динамических веб-страниц]] в 2000-е годы технология стала применяться редко. |
||
В веб-разработке применяется [[Spring Framework]]; для документирования используется утилита [[Javadoc]]. |
В [[Веб-разработка|веб-разработке]] применяется [[Spring Framework]]; для документирования используется утилита [[Javadoc]]. |
||
== Основные особенности языка == |
== Основные особенности языка == |
||
Программы на Java [[транслятор|транслируются]] в [[байт-код Java]], выполняемый [[Java Virtual Machine|виртуальной машиной Java]] (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как [[интерпретатор]]. |
Программы на Java [[транслятор|транслируются]] в [[байт-код Java]], выполняемый [[Java Virtual Machine|виртуальной машиной Java]] (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как [[интерпретатор]]. |
||
[[Файл:Duke (Java mascot) waving.svg|thumb|150px|Дюк |
[[Файл:Duke (Java mascot) waving.svg|thumb|150px|Дюк — талисман Java]] |
||
Достоинством подобного способа выполнения программ является полная независимость байт-кода от [[Операционная система|операционной системы]] и |
Достоинством подобного способа выполнения программ является полная независимость байт-кода от [[Операционная система|операционной системы]] и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание. |
||
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований |
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований немного увеличил скорость выполнения программ на Java: |
||
* применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы ([[JIT]]-технология) с возможностью сохранения версий класса в машинном коде, |
* применение технологии трансляции [[Байт-код Java|байт-кода]] в [[машинный код]] непосредственно во время работы программы ([[JIT]]-технология) с возможностью сохранения версий класса в машинном коде, |
||
* обширное использование [[платформенно-ориентированный код|платформенно-ориентированного кода]] (native-код) в стандартных библиотеках, |
* обширное использование [[платформенно-ориентированный код|платформенно-ориентированного кода]] (native-код) в стандартных библиотеках, |
||
* аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология [[Jazelle]], поддерживаемая некоторыми процессорами [[ARM (архитектура)|архитектуры ARM]]). |
* аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология [[Jazelle]], поддерживаемая некоторыми процессорами [[ARM (архитектура)|архитектуры ARM]]). |
||
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее<ref name="slow_java">{{Cite web |url=http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java |title=Java 6 -server speed ÷ C++ GNU g++ speed {{!}} Computer Language Benchmarks Game |accessdate=2010-03-04 |archiveurl=https://web.archive.org/web/20110614210615/http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java |archivedate=2011-06-14 |deadlink=yes }}</ref>. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией [[Google (компания)|Google]], согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на [[C++]]<ref>{{cite web |
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, но при этом в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее<ref name="slow_java">{{Cite web |url=http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java |title=Java 6 -server speed ÷ C++ GNU g++ speed {{!}} Computer Language Benchmarks Game |accessdate=2010-03-04 |archiveurl=https://web.archive.org/web/20110614210615/http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=java |archivedate=2011-06-14 |deadlink=yes }}</ref>. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией [[Google (компания)|Google]], согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на [[C++]]<ref>{{cite web |
||
|url = https://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/ |
|url = https://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/ |
||
|title = Google pits C++ against Java, Scala, and Go |
|title = Google pits C++ against Java, Scala, and Go |
||
Строка 40: | Строка 52: | ||
|archiveurl = https://www.webcitation.org/6170nFPxZ?url=http://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/ |
|archiveurl = https://www.webcitation.org/6170nFPxZ?url=http://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/ |
||
|archivedate = 2011-08-21 |
|archivedate = 2011-08-21 |
||
}}</ref><ref>[https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf Loop Recognition in C++/Java/Go/Scala]{{ref- |
}}</ref><ref>[https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf Loop Recognition in C++/Java/Go/Scala]{{ref-size|0.3}} {{Wayback|url=https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf |date=20111116151424 }}</ref><ref>{{Cite web |url=http://www.opennet.ru/opennews/art.shtml?num=30784 |title=В Google провели сравнение производительности C++, Java, Go и Scala |access-date=2011-06-05 |archive-date=2011-06-08 |archive-url=https://web.archive.org/web/20110608232010/http://www.opennet.ru/opennews/art.shtml?num=30784 |deadlink=no }}</ref>. |
||
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине<ref>{{cite web |
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине<ref>{{cite web |
||
Строка 56: | Строка 68: | ||
== История версий == |
== История версий == |
||
{{Main|История версий Java}} |
{{Main|История версий Java}} |
||
{{взвешенность|этого описания|дата=2024-01-17}} |
|||
=== JDK 1.0 === |
=== JDK 1.0 === |
||
Разработка Java началась в 1990 |
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0 — была выпущена 23 января 1996 года<ref>{{Cite web|url=https://javaalmanac.io/jdk/1.0/|title=Java 1.0|access-date=2024-12-16|archive-date=2024-12-01|archive-url=https://web.archive.org/web/20241201133138/https://javaalmanac.io/jdk/1.0/|url-status=live}}</ref>. |
||
=== JDK 1.1 === |
=== JDK 1.1 === |
||
Вторая версия была выпущена 19 февраля 1997 |
Вторая версия была выпущена 19 февраля 1997 года<ref>{{Cite web|url=http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml|title=SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED|date=2008-02-10|accessdate=2018-11-17|archive-date=2008-02-10|archive-url=https://web.archive.org/web/20080210044125/http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml|deadlink=unfit}}</ref>. |
||
* Библиотека Accessibility. |
* Библиотека Accessibility. |
||
* Java 2D. |
* [[Java 2D]]. |
||
* Поддержка технологии [[drag-and-drop]]. |
* Поддержка технологии [[drag-and-drop]]. |
||
* Полная поддержка [[Unicode]], включая поддержку ввода на японском, китайском и корейском языках. |
* Полная поддержка [[Unicode]], включая поддержку ввода на японском, китайском и корейском языках. |
||
* Поддержка воспроизведения аудиофайлов нескольких популярных форматов. |
* Поддержка воспроизведения аудиофайлов нескольких популярных форматов. |
||
* Полная поддержка технологии [[CORBA]]. |
* Полная поддержка технологии [[CORBA]]. |
||
* JIT-компилятор, улучшенная производительность. |
* [[JIT-компилятор]], улучшенная производительность. |
||
* Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ. |
* Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ. |
||
=== J2SE 1.2 === |
=== J2SE 1.2 === |
||
Дата выпуска 8 декабря 1998 |
Дата выпуска — 8 декабря 1998 года<ref>{{Cite web|url=http://sun.com/981201/java2/;$sessionid$T0SCTOIAFC41FAMUVFZE3NUBSSUXEUDO|title=Java 2 Software|date=2004-01-19|accessdate=2018-11-17|archive-date=2004-01-19|archive-url=https://web.archive.org/web/20040119200016/http://sun.com/981201/java2/;$sessionid$T0SCTOIAFC41FAMUVFZE3NUBSSUXEUDO|deadlink=unfit}}</ref>. Кодовое имя — Playground. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по J2SE 1.2 (бывшее название — Java 2). Вместе с тем, по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределённые приложения (2011). |
||
В данном случае встречается путаница. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по J2SE 1.2 (бывшее название — Java 2). Вместе с тем по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределённые приложения (2011). |
|||
В то время, когда |
В то время, когда Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если J2SE 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, что приводит к путанице. |
||
=== J2SE 1.3 === |
=== J2SE 1.3 === |
||
Дата выпуска 8 мая 2000 |
Дата выпуска — 8 мая 2000 года. Кодовое имя — Kestrel. |
||
=== J2SE 1.4 === |
=== J2SE 1.4 === |
||
Дата выпуска |
Дата выпуска — 13 февраля 2002 года. Кодовое имя — Merlin. |
||
=== J2SE 5.0 === |
=== J2SE 5.0 === |
||
Спецификация Java 5.0 была выпущена 30 сентября 2004 |
Спецификация Java 5.0 была выпущена 30 сентября 2004 года, кодовое имя — Tiger. C этой версии изменена официальная индексация, вместо Java 1.5 правильнее называть Java 5.0. Внутренняя же индексация Sun осталась прежней — 1.x. Малые изменения теперь включаются без изменения индексации, для этого используется слово «Update» или буква «u», например, Java Development Kit 5.0 Update 22. Предполагается, что в обновления могут входить как исправления ошибок, так и небольшие добавления в API, JVM. |
||
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений: |
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений: |
||
* [[Перечислимый тип|Перечислимые типы]] ({{lang-en|enum}}). Ранее отсутствовавшие в Java типы оформлены по аналогии с [[C++]], но при этом имеют ряд дополнительных возможностей. |
* [[Перечислимый тип|Перечислимые типы]] ({{lang-en|enum}}). Ранее отсутствовавшие в Java типы оформлены по аналогии с [[C++]], но при этом имеют ряд дополнительных возможностей. |
||
** Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе скрытые и абстрактные. |
** Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе — скрытые и абстрактные. |
||
** Перечисление может реализовывать [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]]. |
** Перечисление может реализовывать [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]]. |
||
** Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым. |
** Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым. |
||
* [[Аннотация (Java)|Аннотации]] — возможность добавления в текст программы метаданных, непосредственно не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода. |
* [[Аннотация (Java)|Аннотации]] — возможность добавления в текст программы метаданных, непосредственно не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода. |
||
* Средства [[Обобщённое программирование|обобщённого программирования]] ({{lang-en|generics}}) — механизм, аналогичный средствам языков [[Ада (язык программирования)|Ada]]<ref>{{Cite web|url=http://archive.adaic.com/standards/83lrm/html/lrm-12-01.html#12.1|title=Ada 83 LRM, Sec 12.1: Generic Declarations|publisher=archive.adaic.com|accessdate=2018-11-17}}</ref> и [[Eiffel]] (позже также появились и в C#, принципиально отличаются от шаблонов C++), дающий возможность создавать классы и методы с полями и параметрами произвольного объектного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java. |
* Средства [[Обобщённое программирование|обобщённого программирования]] ({{lang-en|generics}}) — механизм, аналогичный средствам языков [[Ада (язык программирования)|Ada]]<ref>{{Cite web|url=http://archive.adaic.com/standards/83lrm/html/lrm-12-01.html#12.1|title=Ada 83 LRM, Sec 12.1: Generic Declarations|publisher=archive.adaic.com|accessdate=2018-11-17|archive-date=2019-04-17|archive-url=https://web.archive.org/web/20190417155441/http://archive.adaic.com/standards/83lrm/html/lrm-12-01.html#12.1|deadlink=no}}</ref> и [[Eiffel]] (позже также появились и в C#, принципиально отличаются от шаблонов C++), дающий возможность создавать классы и методы с полями и параметрами произвольного объектного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java. |
||
* Методы с неопределённым числом параметров. |
* Методы с неопределённым числом параметров. |
||
* Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-обёртками (например, между int — Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях. |
* Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-обёртками (например, между int — Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях. |
||
* Разрешён импорт статических полей и методов. |
* Разрешён импорт статических полей и методов. |
||
* В язык введён цикл по коллекции объектов (итератор, {{lang-en|foreach}}). |
* В язык введён цикл по коллекции объектов (итератор, {{lang-en|foreach}}). |
||
* |
* Введено использование [[Javadoc]]-комментариев, которые используются для автоматического оформления документации по комментариям в исходном коде. |
||
=== Java SE 6 === |
=== Java SE 6 === |
||
Релиз версии состоялся 11 декабря 2006 |
Релиз версии состоялся 11 декабря 2006 года, кодовое имя — Mustang. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Малые изменения, как и в Java 5.0, вносятся в обычные обновления версии, например, Java Standard Edition Development Kit 6 Update 27. Внесены следующие изменения: |
||
* Коллекции — добавлены интерфейсы для организации: |
|||
* Коллекции — добавлены интерфейсы для организации очереди, работающей с двух сторон коллекции; организовывающие поиск по ближайшему соответствию; блокирующие себя во время ожидания элемента. Организованы новые классы, реализующие перечисленные интерфейсы. |
|||
** [[Двухсторонняя очередь|двухсторонних очередей]], в том числе — блокирующих себя во время ожидания элемента; |
|||
** множеств и словарей, организовывающих поиск по ближайшему соответствию (Navigable Set/Navigable Map). |
|||
При этом организованы новые классы, реализующие перечисленные интерфейсы<ref>{{Cite web|url=https://docs.oracle.com/javase/6/docs/technotes/guides/collections/changes6.html|title=Collections Framework Enhancements|publisher=oracle.com|accessdate=2023-09-12|archive-date=2023-11-25|archive-url=https://web.archive.org/web/20231125190420/https://docs.oracle.com/javase/6/docs/technotes/guides/collections/changes6.html|url-status=live}}</ref>. |
|||
* Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями). |
* Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями). |
||
* Доступны классы-потоки для чтения и передачи сжатых данных, с возможностью передачи их по сети. Сняты ограничения на количество файлов в архиве (ранее 64 Кб), длину названия файла (ранее 256 символов) и количество одновременно открытых файлов (ранее 2000 шт). |
* Доступны классы-потоки для чтения и передачи сжатых данных, с возможностью передачи их по сети. Сняты ограничения на количество файлов в архиве (ранее — 64 Кб), длину названия файла (ранее — 256 символов) и количество одновременно открытых файлов (ранее — 2000 шт). |
||
* Организована система управления кэшем и добавлена поддержка параметра «no-cache» в HTTP-запросе. |
* Организована система управления кэшем и добавлена поддержка параметра «no-cache» в HTTP-запросе. |
||
* JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой. |
* JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой. |
||
* Java HTTP Server |
* Java HTTP Server позволяет создать полноценный HTTP-сервер, с минимально необходимыми функциональными свойствами. |
||
* Повысилась скорость вычислений на 70 %, скорость операций ввода-вывода возросла в два раза<ref> |
* Повысилась скорость вычислений на 70 %, скорость операций ввода-вывода возросла в два раза<ref>{{Cite web |url=http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.3 |title=Результаты тестов |access-date=2012-09-13 |archive-date=2012-06-25 |archive-url=https://web.archive.org/web/20120625232327/http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.3 |deadlink=no }}</ref>. |
||
* Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами формата [[GIF]]. |
* Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами формата [[GIF]]. |
||
* Исправлено большое количество ошибок. |
* Исправлено большое количество ошибок. |
||
=== |
=== [[JavaFX]] === |
||
Дата выпуска 8 октября 2013 |
Дата выпуска — 8 октября 2013 года. |
||
JavaFX 2.2 вошёл в состав Java SE 7 update 6<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#5|title=JavaFX FAQ|publisher=www.oracle.com|accessdate=2018-11-17}}</ref>. С 11-й версии модуль поставляется отдельно от JDK<ref>{{Cite news|title=The Future of JavaFX and Other Java Client Roadmap Updates|first=Donald|last=Smith|url=https://blogs.oracle.com/java-platform-group/the-future-of-javafx-and-other-java-client-roadmap-updates| |
JavaFX 2.2 вошёл в состав Java SE 7 update 6<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#5|title=JavaFX FAQ|publisher=www.oracle.com|accessdate=2018-11-17|archive-date=2018-10-29|archive-url=https://web.archive.org/web/20181029152754/https://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html#5|deadlink=no}}</ref>. С 11-й версии модуль поставляется отдельно от JDK<ref>{{Cite news|title=The Future of JavaFX and Other Java Client Roadmap Updates|first=Donald|last=Smith|url=https://blogs.oracle.com/java-platform-group/the-future-of-javafx-and-other-java-client-roadmap-updates|access-date=2018-11-17|archive-date=2018-11-17|archive-url=https://web.archive.org/web/20181117154003/https://blogs.oracle.com/java-platform-group/the-future-of-javafx-and-other-java-client-roadmap-updates}}</ref>. |
||
=== Java ME Embedded === |
=== Java ME Embedded === |
||
Дата выпуска 10 октября 2013 |
Дата выпуска — 10 октября 2013 года. Кодовое имя — Micro Edition. |
||
=== Java SE 7 === |
=== Java SE 7 === |
||
Релиз версии состоялся 28 июля 2011 |
Релиз версии состоялся 28 июля 2011 года, кодовое имя — Dolphin<ref>{{Cite web |url=http://openjdk.java.net/projects/jdk7/ |title=план разработки для JDK7 |access-date=2011-07-04 |archive-date=2021-01-08 |archive-url=https://web.archive.org/web/20210108163810/http://openjdk.java.net/projects/jdk7/ |deadlink=no }}</ref>. В финальную версию Java Standard Edition 7 не были включены все ранее запланированные изменения. Согласно плану развития (план «Б»)<ref>{{Cite web |url=http://mreinhold.org/blog/plan-b |title=План Б |access-date=2011-07-04 |archive-date=2011-07-11 |archive-url=https://web.archive.org/web/20110711153437/http://mreinhold.org/blog/plan-b |deadlink=no }}</ref>, включение нововведений будет разбито на две части: Java Standard Edition 7 (без [[Лямбда-исчисление|лямбда-исчисления]], проекта Jigsaw, и части улучшений проекта Coin<ref>{{Cite web|url=http://openjdk.java.net/projects/coin/|title=OpenJDK: Project Coin|publisher=openjdk.java.net|accessdate=2018-11-17|archive-date=2012-10-04|archive-url=https://www.webcitation.org/6B9wslN3c?url=http://openjdk.java.net/projects/coin/|deadlink=no}}</ref>) и Java Standard Edition 8 (всё остальное), намеченный на конец 2012 года. |
||
В новой версии, получившей название Java Standard Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок, было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standard Edition 7 использован не проприетарный пакет [[JDK]], а его открытая реализация [[OpenJDK]], а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров [[Oracle]] с участниками мировой экосистемы Java, комитетом [[JCP]] (Java Community Process) и сообществом [[OpenJDK]]. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standard Edition 7 собраны на основе кодовой базы [[OpenJDK]], сама эталонная реализация полностью открыта под лицензией [[GPLv2]] с исключениями [[GNU]] ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям |
В новой версии, получившей название Java Standard Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок, было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standard Edition 7 использован не проприетарный пакет [[JDK]], а его открытая реализация [[OpenJDK]], а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров [[Oracle]] с участниками мировой экосистемы Java, комитетом [[JCP]] (Java Community Process) и сообществом [[OpenJDK]]. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standard Edition 7 собраны на основе кодовой базы [[OpenJDK]], сама эталонная реализация полностью открыта под лицензией [[GPLv2]] с исключениями [[GNU]] ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям относятся: |
||
* интеграция набора небольших языковых улучшений Java, развиваемых в рамках проекта Coin, |
|||
* добавлена поддержка языков программирования с динамической типизацией, таких, как [[Ruby]], [[Python]] и [[JavaScript]], |
|||
* поддержка загрузки классов по [[URL]], |
|||
* обновлённый [[XML]]-стек, включающий [[JAXP]] 1.4, [[JAXB]] 2.2a и [[JAX-WS]] 2.2 и другие<ref>[http://citforum.ru/news/26682/ Компания Oracle анонсировала выход Java Standard Edition 7] {{Wayback|url=http://citforum.ru/news/26682/ |date=20110803050831 }}{{ref-ru}}</ref>. |
|||
За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом<ref>[http://www.lucidimagination.com/search/document/1a0d3986e48a9348/warning_index_corruption_and_crashes_in_apache_lucene_core_apache_solr_with_java_7 Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7]{{ref-en}}</ref>. |
За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом<ref>[http://www.lucidimagination.com/search/document/1a0d3986e48a9348/warning_index_corruption_and_crashes_in_apache_lucene_core_apache_solr_with_java_7 Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7] {{Wayback|url=http://www.lucidimagination.com/search/document/1a0d3986e48a9348/warning_index_corruption_and_crashes_in_apache_lucene_core_apache_solr_with_java_7 |date=20210809094854 }}{{ref-en}}</ref>. |
||
==== Список нововведений ==== |
==== Список нововведений ==== |
||
* Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java<ref>[http://ntv.ifmo.ru/ru/article/515/aktornoe_rasshirenie_yazyka_JAVA_v_srede_MPS.htm Акторное расширение языка Java в среде MPS]. — вестник ИТМО. — Вып 6 (94)</ref> для поддержки динамически-типизированных языков. |
* Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java<ref>[http://ntv.ifmo.ru/ru/article/515/aktornoe_rasshirenie_yazyka_JAVA_v_srede_MPS.htm Акторное расширение языка Java в среде MPS] {{Wayback|url=http://ntv.ifmo.ru/ru/article/515/aktornoe_rasshirenie_yazyka_JAVA_v_srede_MPS.htm |date=20150429090618 }}. — вестник ИТМО. — Вып 6 (94)</ref> для поддержки динамически-типизированных языков. |
||
* Строгая проверка class-файлов — class-файлы версии 51 (Java Standard Edition 7) или более поздней версии должны быть проверены typechecking-верификатором; JVM не должна переключаться на старый верификатор. |
* Строгая проверка class-файлов — class-файлы версии 51 (Java Standard Edition 7) или более поздней версии должны быть проверены typechecking-верификатором; JVM не должна переключаться на старый верификатор. |
||
* Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования: |
* Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования: |
||
Строка 150: | Строка 169: | ||
=== Java SE 8 === |
=== Java SE 8 === |
||
Релиз версии состоялся 19 марта 2014 |
Релиз версии состоялся 19 марта 2014 года. Кодовое имя — Octopus. |
||
==== Список нововведений ==== |
==== Список нововведений ==== |
||
Строка 156: | Строка 175: | ||
* Полноценная поддержка [[Лямбда-выражения|лямбда-выражений]]. |
* Полноценная поддержка [[Лямбда-выражения|лямбда-выражений]]. |
||
* Ключевое слово <code>default</code> в интерфейсах для поддержки функциональности по умолчанию. |
* Ключевое слово <code>default</code> в интерфейсах для поддержки функциональности по умолчанию. |
||
*Статические методы в интерфейсах. |
* Статические методы в интерфейсах. |
||
* Ссылки на методы и конструкторы<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html|title=What's New in JDK 8|publisher=www.oracle.com|accessdate=2018-11-17}}</ref><ref>{{cite web|url=https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html|title=Method References|author=|website=The Java™ Tutorials|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-11-17}}</ref>. |
* Ссылки на методы и конструкторы<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html|title=What's New in JDK 8|publisher=www.oracle.com|accessdate=2018-11-17|archive-date=2020-04-13|archive-url=https://web.archive.org/web/20200413130210/https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html|deadlink=no}}</ref><ref>{{cite web|url=https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html|title=Method References|author=|website=The Java™ Tutorials|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-11-17|archive-date=2018-10-21|archive-url=https://web.archive.org/web/20181021122518/https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html|deadlink=no}}</ref>. |
||
* Функциональные интерфейсы ([[предикат]]ы, поставщики и т. д.) |
* Функциональные интерфейсы ([[предикат]]ы, поставщики и т. д.) |
||
* Потоки (stream) для работы с коллекциями. |
* Потоки (stream) для работы с коллекциями. |
||
Строка 164: | Строка 183: | ||
=== Java SE 9 === |
=== Java SE 9 === |
||
В связи со сложностями в реализации модульной системы в рамках проекта Jigsaw, релиз версии, первоначально запланированный 22 сентября [[2016 |
В связи со сложностями в реализации модульной системы в рамках проекта Jigsaw, релиз версии, первоначально запланированный 22 сентября [[2016 год]]а, несколько раз откладывался: сначала дата была перенесена на 23 марта [[2017 год]]а, потом — на 27 июля 2017 года, а затем — на 21 сентября 2017 года<ref>{{Cite web |url=https://www.theregister.co.uk/2016/09/14/jdk_9_release_delay/ |title=JDK 9 release delayed another four months |access-date=2017-05-17 |archive-date=2017-05-09 |archive-url=https://web.archive.org/web/20170509120833/http://www.theregister.co.uk/2016/09/14/jdk_9_release_delay |deadlink=no }}</ref><ref>{{Cite web |url=http://www.infoworld.com/article/3176593/java/java-9-gets-a-release-date-july-27.html |title=Java 9 gets a release date: July 27 |access-date=2017-05-17 |archive-date=2017-05-17 |archive-url=https://web.archive.org/web/20170517133103/http://www.infoworld.com/article/3176593/java/java-9-gets-a-release-date-july-27.html |deadlink=no }}</ref><ref>{{Cite web |url=https://jaxenter.com/java-9-schedule-change-sept-134484.html |title=Java 9 delayed to September 21 |access-date=2017-07-29 |archive-date=2017-07-29 |archive-url=https://web.archive.org/web/20170729181402/https://jaxenter.com/java-9-schedule-change-sept-134484.html |deadlink=no }}</ref>. |
||
Последняя дата стала официальной датой релиза версии<ref>{{cite web|title=Oracle Announces Java SE 9 and Java EE 8. Press Release|url=https://www.oracle.com/corporate/pressrelease/java-se-9-and-ee-8-092117.html|date=2017-09-21|work=Oracle|accessdate=2018-08-01|language=en}}</ref>. |
Последняя дата стала официальной датой релиза версии<ref>{{cite web|title=Oracle Announces Java SE 9 and Java EE 8. Press Release|url=https://www.oracle.com/corporate/pressrelease/java-se-9-and-ee-8-092117.html|date=2017-09-21|work=Oracle|accessdate=2018-08-01|language=en|archive-date=2018-10-02|archive-url=https://web.archive.org/web/20181002112135/https://www.oracle.com/corporate/pressrelease/java-se-9-and-ee-8-092117.html|deadlink=no}}</ref>. |
||
==== Список нововведений ==== |
==== Список нововведений ==== |
||
* Интеграция Jigsaw, в рамках которого разработана модульная система для платформы Java 9 и применена к JDK 9<ref>{{Cite web|url=http://openjdk.java.net/projects/jigsaw/|title=Project Jigsaw|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24}}</ref>. |
* Интеграция Jigsaw, в рамках которого разработана модульная система для платформы Java 9 и применена к JDK 9<ref>{{Cite web|url=http://openjdk.java.net/projects/jigsaw/|title=Project Jigsaw|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24|archive-date=2021-01-09|archive-url=https://web.archive.org/web/20210109223445/http://openjdk.java.net/projects/jigsaw/|deadlink=no}}</ref>. |
||
* Обновление Process API для улучшения взаимодействия с процессами операционной системы. Обновление мотивировано тем, что разработчикам зачастую приходилось писать платформозависимый код для таких задач<ref>{{cite web|url=http://openjdk.java.net/jeps/102|title=JEP 102: Process API Updates|website=OpenJDK|language=en}}</ref>. |
* Обновление Process API для улучшения взаимодействия с процессами операционной системы. Обновление мотивировано тем, что разработчикам зачастую приходилось писать платформозависимый код для таких задач<ref>{{cite web|url=http://openjdk.java.net/jeps/102|title=JEP 102: Process API Updates|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-06|archive-url=https://web.archive.org/web/20180906195748/http://openjdk.java.net/jeps/102|deadlink=no}}</ref>. |
||
* Временно экспериментальный<ref name=":0">{{cite web|url=http://openjdk.java.net/jeps/110|title=JEP 110: HTTP/2 Client (Incubator)|website=OpenJDK|language=en}}</ref><ref>{{cite web|title=JEP 11: Incubator Modules|url=http://openjdk.java.net/jeps/11|website=OpenJDK|language=en}}</ref> новый HTTP-клиент с поддержкой [[HTTP/2]] и веб-сокетов; предназначен заменить устаревший класс <code>HttpURLConnection</code><ref group="док.">{{Javadoc:SE|java.base/java/net|HttpURLConnection}}</ref><ref name=":0" />. |
* Временно экспериментальный<ref name=":0">{{cite web|url=http://openjdk.java.net/jeps/110|title=JEP 110: HTTP/2 Client (Incubator)|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-02|archive-url=https://web.archive.org/web/20180902080410/http://openjdk.java.net/jeps/110|deadlink=no}}</ref><ref>{{cite web|title=JEP 11: Incubator Modules|url=http://openjdk.java.net/jeps/11|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-15|archive-url=https://web.archive.org/web/20180915233512/http://openjdk.java.net/jeps/11|deadlink=no}}</ref> новый HTTP-клиент с поддержкой [[HTTP/2]] и веб-сокетов; предназначен заменить устаревший класс <code>HttpURLConnection</code><ref group="док.">{{Javadoc:SE|java.base/java/net|HttpURLConnection}}</ref><ref name=":0" />. |
||
* Сжатые строки: если содержимое строки позволяет, она может кодироваться в [[ISO 8859-1|Latin-1]] (один байт на символ); выбор кодировки конкретного экземпляра класса <code>String</code> отображается в значении переменной-[[Флаг (компьютерная техника)|флага]], которая теперь есть у всех строк.<ref>{{cite web|title=JEP 254: Compact Strings|url=http://openjdk.java.net/jeps/254|website=OpenJDK|language=en}}</ref> |
* Сжатые строки: если содержимое строки позволяет, она может кодироваться в [[ISO 8859-1|Latin-1]] (один байт на символ); выбор кодировки конкретного экземпляра класса <code>String</code> отображается в значении переменной-[[Флаг (компьютерная техника)|флага]], которая теперь есть у всех строк.<ref>{{cite web|title=JEP 254: Compact Strings|url=http://openjdk.java.net/jeps/254|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-08|archive-url=https://web.archive.org/web/20180908193126/http://openjdk.java.net/jeps/254|deadlink=no}}</ref> |
||
* Поддержка указанных в [https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf NIST FIPS 202] алгоритмов хеширования [[SHA-3]], кроме SHAKE128 и SHAKE256. Алгоритмы использования SHA-3 в качестве основы для других криптографических функций не реализованы в силу отсутствия соответствующих стандартов<ref>{{cite web|url=http://openjdk.java.net/jeps/287|title=JEP 287: SHA-3 Hash Algorithms|website=OpenJDK|language=en}}</ref>. |
* Поддержка указанных в [https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf NIST FIPS 202] алгоритмов хеширования [[SHA-3]], кроме SHAKE128 и SHAKE256. Алгоритмы использования SHA-3 в качестве основы для других криптографических функций не реализованы в силу отсутствия соответствующих стандартов<ref>{{cite web|url=http://openjdk.java.net/jeps/287|title=JEP 287: SHA-3 Hash Algorithms|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-06|archive-url=https://web.archive.org/web/20180906195638/http://openjdk.java.net/jeps/287|deadlink=no}}</ref>. |
||
* Улучшены средства для пометки [[Deprecation|устаревшего]] API. В аннотацию <code>@Deprecated</code> добавлен параметр, позволяющий указывать версию программы, с которой использование отмеченного элемента не рекомендуется, а также — параметр, позволяющий указать, что запланировано удаление элемента в какой-либо из будущих версий<ref>{{cite web|url=http://openjdk.java.net/jeps/277|title=JEP 277: Enhanced Deprecation|website=OpenJDK|language=en}}</ref>. |
* Улучшены средства для пометки [[Deprecation|устаревшего]] API. В аннотацию <code>@Deprecated</code> добавлен параметр, позволяющий указывать версию программы, с которой использование отмеченного элемента не рекомендуется, а также — параметр, позволяющий указать, что запланировано удаление элемента в какой-либо из будущих версий<ref>{{cite web|url=http://openjdk.java.net/jeps/277|title=JEP 277: Enhanced Deprecation|website=OpenJDK|language=en|access-date=2018-09-06|archive-date=2018-09-19|archive-url=https://web.archive.org/web/20180919074206/http://openjdk.java.net/jeps/277|deadlink=no}}</ref>. |
||
* <code>private</code> методы в интерфейсах<ref>{{Cite web|url=https://docs.oracle.com/en/java/javase/17/language/java-language-changes.html|title=Java Language Updates|publisher=www.oracle.com|access-date=2021-11-14|archive-date=2021-11-14|archive-url=https://web.archive.org/web/20211114123350/https://docs.oracle.com/en/java/javase/17/language/java-language-changes.html|deadlink=no}}</ref>. |
|||
* Поддержка GTK+ 3 на Linux<ref>{{Cite web|url=http://openjdk.java.net/jeps/283|title=JEP 283: Enable GTK 3 on Linux|publisher=openjdk.java.net|accessdate=2018-11-25}}</ref>. |
|||
* Поддержка GTK+ 3 на [[Linux]]<ref>{{Cite web|url=http://openjdk.java.net/jeps/283|title=JEP 283: Enable GTK 3 on Linux|publisher=openjdk.java.net|accessdate=2018-11-25|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124232023/http://openjdk.java.net/jeps/283|deadlink=no}}</ref>. |
|||
=== Java SE 10 === |
=== Java SE 10 === |
||
Дата релиза: 20 марта 2018 |
Дата релиза: 20 марта 2018 года<ref name="Java-10-032018">{{Cite web|url=https://www.oracle.com/corporate/pressrelease/Java-10-032018.html|title=Oracle Java SE 10 Release Arrives|publisher=ORACLE|lang=en|accessdate=2018-06-24|deadlink=no|archiveurl=https://web.archive.org/web/20180320171607/https://www.oracle.com/corporate/pressrelease/Java-10-032018.html|archivedate=2018-03-20}}</ref>. |
||
==== Список нововведений ==== |
==== Список нововведений ==== |
||
Официальный частичный список нововведений и план релиза [http://openjdk.java.net/projects/jdk/10/ расположен на сайте OpenJDK]. |
Официальный частичный список нововведений и план релиза [http://openjdk.java.net/projects/jdk/10/ расположен на сайте OpenJDK]. |
||
* [[Вывод типов]] локальных переменных, помеченных с помощью ключевого слова <code>var</code><ref>{{Cite web|url=https://openjdk.java.net/jeps/286|title=JEP 286: Local-Variable Type Inference|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* [[Вывод типов]] локальных переменных, помеченных с помощью ключевого слова <code>var</code><ref>{{Cite web|url=https://openjdk.java.net/jeps/286|title=JEP 286: Local-Variable Type Inference|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118205859/https://openjdk.java.net/jeps/286|deadlink=no}}</ref>. |
||
* Создание прозрачного интерфейса сборщика мусора для упрощения разработки новых сборщиков<ref>{{Cite web|url=http://openjdk.java.net/jeps/304|title=JEP 304: Garbage Collector Interface|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-20}}</ref>. |
* Создание прозрачного интерфейса сборщика мусора для упрощения разработки новых сборщиков<ref>{{Cite web|url=http://openjdk.java.net/jeps/304|title=JEP 304: Garbage Collector Interface|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-20|archive-date=2018-10-03|archive-url=https://web.archive.org/web/20181003145121/http://openjdk.java.net/jeps/304|deadlink=no}}</ref>. |
||
* Уменьшено время задержек многопоточного сборщика мусора G1 за счёт реализации параллельного полного цикла сборки мусора<ref>{{Cite web|url=http://openjdk.java.net/jeps/307|title=JEP 307: Parallel Full GC for G1|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-21}}</ref>. |
* Уменьшено время задержек многопоточного сборщика мусора G1 за счёт реализации параллельного полного цикла сборки мусора<ref>{{Cite web|url=http://openjdk.java.net/jeps/307|title=JEP 307: Parallel Full GC for G1|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-21|archive-date=2018-10-03|archive-url=https://web.archive.org/web/20181003145703/http://openjdk.java.net/jeps/307|deadlink=no}}</ref>. |
||
* Возможность выполнять [[Callback (программирование)|функции обратного вызова]] на потоках, не делая глобальных блокировок<ref>{{Cite web|url=http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html|title=Safepoints in HotSpot JVM|author=Алексей Рагозин|website=|date=|publisher=blog.ragozin.info|lang=en|accessdate=2018-11-24}}</ref> в рамках всех потоков<ref>{{Cite web|url=http://openjdk.java.net/jeps/312|title=JEP 312: Thread-Local Handshakes|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24}}</ref>. |
* Возможность выполнять [[Callback (программирование)|функции обратного вызова]] на потоках, не делая глобальных блокировок<ref>{{Cite web|url=http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html|title=Safepoints in HotSpot JVM|author=Алексей Рагозин|website=|date=|publisher=blog.ragozin.info|lang=en|accessdate=2018-11-24|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124220256/http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html|deadlink=no}}</ref> в рамках всех потоков<ref>{{Cite web|url=http://openjdk.java.net/jeps/312|title=JEP 312: Thread-Local Handshakes|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24|archive-date=2018-10-21|archive-url=https://web.archive.org/web/20181021234625/http://openjdk.java.net/jeps/312|deadlink=no}}</ref>. |
||
* Поддержка символов из новых расширений Unicode: cu (тип валюты), fw (первый день недели), rg (двухбуквенные коды стран и регионов), tz (часовой пояс)<ref>{{Cite web|url=http://openjdk.java.net/jeps/314|title=JEP 314: Additional Unicode Language-Tag Extensions|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22}}</ref>. |
* Поддержка символов из новых расширений Unicode: cu (тип валюты), fw (первый день недели), rg (двухбуквенные коды стран и регионов), tz (часовой пояс)<ref>{{Cite web|url=http://openjdk.java.net/jeps/314|title=JEP 314: Additional Unicode Language-Tag Extensions|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22|archive-date=2018-10-05|archive-url=https://web.archive.org/web/20181005020636/http://openjdk.java.net/jeps/314|deadlink=no}}</ref>. |
||
* [[HotSpot|HotSpot VM]] теперь может выделять память [[Куча (память)|кучи]] для объектов на альтернативных устройствах [[Оперативная память|оперативной памяти]], в том числе тех, которые обладают [[Энергонезависимая память|энергонезависимой памятью]], как, например, накопители [[3D XPoint|Intel Optane Memory]]<ref>{{Cite web|url=http://openjdk.java.net/jeps/316|title=JEP 316: Heap Allocation on Alternative Memory Devices|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24}}</ref>. |
* [[HotSpot|HotSpot VM]] теперь может выделять память [[Куча (память)|кучи]] для объектов на альтернативных устройствах [[Оперативная память|оперативной памяти]], в том числе тех, которые обладают [[Энергонезависимая память|энергонезависимой памятью]], как, например, накопители [[3D XPoint|Intel Optane Memory]]<ref>{{Cite web|url=http://openjdk.java.net/jeps/316|title=JEP 316: Heap Allocation on Alternative Memory Devices|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-24|archive-date=2018-10-22|archive-url=https://web.archive.org/web/20181022002624/http://openjdk.java.net/jeps/316|deadlink=no}}</ref>. |
||
* Новый экспериментальный [[JIT-компиляция|JIT-компилятор]] Graal, предоставляющий возможности [[AOT-компиляция|Ahead-of-Time]] компиляции; по умолчанию отключён, работает только на Linux/x64<ref>{{Cite web|url=http://openjdk.java.net/jeps/317|title=JEP 317: Experimental Java-Based JIT Compiler|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22}}</ref>. |
* Новый экспериментальный [[JIT-компиляция|JIT-компилятор]] Graal, предоставляющий возможности [[AOT-компиляция|Ahead-of-Time]] компиляции; по умолчанию отключён, работает только на [[Linux]]/x64<ref>{{Cite web|url=http://openjdk.java.net/jeps/317|title=JEP 317: Experimental Java-Based JIT Compiler|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124182636/http://openjdk.java.net/jeps/317|deadlink=no}}</ref>. |
||
* Обновление системы нумерации версий Java SE и JDK с целью приближения к схеме управления версиями по времени<ref>{{Cite web|url=http://openjdk.java.net/jeps/322|title=JEP 322: Time-Based Release Versioning|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22}}</ref>. |
* Обновление системы нумерации версий Java SE и JDK с целью приближения к схеме управления версиями по времени<ref>{{Cite web|url=http://openjdk.java.net/jeps/322|title=JEP 322: Time-Based Release Versioning|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-22|archive-date=2018-10-31|archive-url=https://web.archive.org/web/20181031073021/http://openjdk.java.net/jeps/322|deadlink=no}}</ref>. |
||
=== Java SE 11 === |
=== Java SE 11 === |
||
Официальный частичный список нововведений и план релиза [http://openjdk.java.net/projects/jdk/11/ расположен на сайте OpenJDK]. Дата релиза — 25 сентября 2018 |
Официальный частичный список нововведений и план релиза [http://openjdk.java.net/projects/jdk/11/ расположен на сайте OpenJDK]. Дата релиза — 25 сентября 2018 года. |
||
==== Список нововведений ==== |
==== Список нововведений ==== |
||
* Обновление системы управления доступом, позволяющее вложенным классам обращаться к закрытым (private) методам и полям внешнего класса (и наоборот) без необходимости создания компилятором промежуточных методов с повышением уровня доступа<ref>{{Cite web|url=https://openjdk.java.net/jeps/181|title=JEP 181: Nest-Based Access Control|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Обновление системы управления доступом, позволяющее вложенным классам обращаться к закрытым (private) методам и полям внешнего класса (и наоборот) без необходимости создания компилятором промежуточных методов с повышением уровня доступа<ref>{{Cite web|url=https://openjdk.java.net/jeps/181|title=JEP 181: Nest-Based Access Control|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118205904/https://openjdk.java.net/jeps/181|deadlink=no}}</ref>. |
||
* Epsilon — новый сборщик мусора, собственно сборкой мусора не занимающийся вообще; при использовании Epsilon превышение предела выделяемой памяти приводит к |
* Epsilon — новый сборщик мусора, собственно сборкой мусора не занимающийся вообще; при использовании Epsilon превышение предела выделяемой памяти приводит к завершению работы JVM<ref>{{Cite web|url=https://openjdk.java.net/jeps/318|title=JEP 318: Epsilon: A No-Op Garbage Collector (Experimental)|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118164732/https://openjdk.java.net/jeps/318|deadlink=no}}</ref>. |
||
* Стандартизирован клиент HTTP с поддержкой HTTP/2, введённый в Java 9 как экспериментальный<ref>{{Cite web|url=https://openjdk.java.net/jeps/321|title=JEP 321: HTTP Client (Standard)|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Стандартизирован клиент HTTP с поддержкой HTTP/2, введённый в Java 9 как экспериментальный<ref>{{Cite web|url=https://openjdk.java.net/jeps/321|title=JEP 321: HTTP Client (Standard)|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124195519/http://openjdk.java.net/jeps/321|deadlink=no}}</ref>. |
||
* Параметры [[Лямбда-выражение|лямбда-функций]] могут быть [[Вывод типов|неявно типизированы]] путём вывода типов через ключевое слово (<code>var</code>) для унификации с синтаксисом локальных переменных, введённым в JDK 10<ref>{{Cite web|url=https://openjdk.java.net/jeps/323|title=JEP 323: Local-Variable Syntax for Lambda Parameters|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Параметры [[Лямбда-выражение|лямбда-функций]] могут быть [[Вывод типов|неявно типизированы]] путём вывода типов через ключевое слово (<code>var</code>) для унификации с синтаксисом локальных переменных, введённым в JDK 10<ref>{{Cite web|url=https://openjdk.java.net/jeps/323|title=JEP 323: Local-Variable Syntax for Lambda Parameters|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-15|archive-url=https://web.archive.org/web/20181115181413/https://openjdk.java.net/jeps/323|deadlink=no}}</ref>. |
||
* Поддержка 10-й версии стандарта [[Юникод#Версии Юникода|Unicode]]<ref>{{Cite web|url=https://openjdk.java.net/jeps/327|title=JEP 327: Unicode 10|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Поддержка 10-й версии стандарта [[Юникод#Версии Юникода|Unicode]]<ref>{{Cite web|url=https://openjdk.java.net/jeps/327|title=JEP 327: Unicode 10|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118205902/https://openjdk.java.net/jeps/327|deadlink=no}}</ref>. |
||
* Поддержка протокола [[TLS|TLS 1.3]]<ref>{{Cite web|url=https://openjdk.java.net/jeps/332|title=JEP 332: Transport Layer Security (TLS) 1.3|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Поддержка протокола [[TLS|TLS 1.3]]<ref>{{Cite web|url=https://openjdk.java.net/jeps/332|title=JEP 332: Transport Layer Security (TLS) 1.3|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118205848/https://openjdk.java.net/jeps/332|deadlink=no}}</ref>. |
||
* Экспериментальный масштабируемый сборщик мусора ZGC с низкими задержками. По умолчанию отключён, работает только на Linux/x64<ref>{{Cite web|url=https://openjdk.java.net/jeps/333|title=JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18}}</ref>. |
* Экспериментальный масштабируемый сборщик мусора ZGC с низкими задержками. По умолчанию отключён, работает только на [[Linux]]/x64<ref>{{Cite web|url=https://openjdk.java.net/jeps/333|title=JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)|author=|website=|date=|publisher=openjdk.java.net|lang=en|accessdate=2018-11-18|archive-date=2018-11-18|archive-url=https://web.archive.org/web/20181118205724/https://openjdk.java.net/jeps/333|deadlink=no}}</ref>. |
||
=== Java SE 12 === |
|||
Дата релиза — 13 марта 2019 года. |
|||
==== Изменения ==== |
|||
* блок <code>switch</code> может использоваться в выражениях присваивания значения переменной; |
|||
* добавлена поддержка 11-й версии стандарта [[Юникод#Версии Юникода|Unicode]]; |
|||
* сборщик мусора ZGC: добавлена поддержка выгрузки классов; |
|||
* сборщик мусора G1: добавлена экспериментальная возможность размещения [[Модель памяти Java#старое поколение|старого поколения]] [[Куча (память)|кучи]] на альтернативных модулях памяти, например, {{iw|NVDIMM|||NVDIMM}}; |
|||
* в классе NumberFormat добавлена поддержка компактного вывода больших чисел, например: 1K=1000, 1M=1 000 000; |
|||
* устранены некоторые неиспользумые (или признанные [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]] классы и/или их методы, например, класс SecurityWarning из пакета AWT, методы finalize в классах FileInputStream и FileOutputStream<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/12-relnotes.html|title=JDK 12 Release Notes|accessdate=2023-09-24|archive-date=2023-09-27|archive-url=https://web.archive.org/web/20230927213948/https://www.oracle.com/java/technologies/javase/12-relnotes.html|url-status=live}}</ref>. |
|||
=== Java SE 13 === |
|||
Дата релиза — 17 сентября 2019 года<ref name="Java_language_changes_history">{{Cite web|url=https://www.java.com/releases/|title=JDK Releases|accessdate=2024-01-16|archive-date=2022-06-04|archive-url=https://web.archive.org/web/20220604052722/https://www.java.com/releases/|url-status=live}}</ref>. |
|||
==== Изменения ==== |
|||
* в блоках <code>switch</code> добавлена возможность использования ключевого слова <code>yield</code>, возвращающего указанное за ним значение; |
|||
* для компактной записи строковых констант введена экспериментальная возможность работы с текстовыми блоками, обрамлённых тройками двойных кавычек ("""); |
|||
* в классе FileSystems пакета java.nio.file добавлены новые реализации метода newFileSystem; |
|||
* методы get/put класса ByteBuffer пакета java.nio пересылают данные вне зависимости от текущей позиции в буфере передачи; |
|||
* добавлена поддержка [[Юникод#Версии Юникода|Unicode]] 12.1; |
|||
* сборщик мусора ZGC возвращает более неиспользуемую память [[куча (память)|кучи]] ОС, при этом максимальный поддерживаемый размер памяти кучи увеличен до 16 [[Терабайт|ТБ]]; |
|||
* в [[Java Cryptography Architecture|JCA]] добавлена возможность чтения приватных ключей в формате {{нп2|CryptoAPI: Next Generation|CryptoAPI: Next Generation|en|Microsoft CryptoAPI}}; |
|||
* для [[macOS]] исключена поддержка стиля оформления (look-and-feel) Swing Motif<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/13-relnote-issues.html|title=JDK 13 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116162156/https://www.oracle.com/java/technologies/javase/13-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 14 === |
|||
Дата релиза — 17 марта 2020 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* экспериментально введено ключевое слово <code>record</code> — для обозначения неизменяемых (<code>final</code>) классов, являющихся контейнерами неизменяемых данных (записей); |
|||
* введено сопоставление шаблонов для оператора <code>instanceof</code> в блоках <code>switch</code>; |
|||
* в метках <code>case</code> блоков <code>switch</code> могут использоваться «стрелочные» (->) операторы; |
|||
* исключён сборщик мусора Concurrent Mark and Sweep (CMS); |
|||
* методы suspend и resume классов Thread и ThreadGroup признаны [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]]<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/14all-relnotes.html|title=Consolidated JDK 14 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116162157/https://www.oracle.com/java/technologies/javase/14all-relnotes.html|url-status=live}}</ref>. |
|||
=== Java SE 15 === |
|||
Дата релиза — 15 сентября 2020 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* добавлена экспериментальная возможность использования запечатанных (<code>sealed</code>) классов/интерфейсов, при объявлении которых с помощью нового ключевого слова <code>permits</code> можно указывать, какие классы/интерфейсы могут наследовать данный запечатанный класс/интерфейс; |
|||
* добавлена возможность использования скрытых (<code>hidden</code>) классов, которые не могут использоваться непосредственно [[Байт-код Java|байт-кодом Java]] или другими классами; |
|||
* в синтаксис языка официально введена экспериментально добавленная в Java 13 возможность работы с текстовыми блоками; |
|||
* добавлена поддержка [[Юникод#Версии Юникода|Unicode]] 13.0; |
|||
* в классе CharSequence добавлен <code>default</code>-метод isEmpty; |
|||
* в классе TreeMap добавлена возможность перегрузки методов putIfAbsent, computeIfAbsent, computeIfPresent, compute, merge<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/15-relnote-issues.html|title=JDK 15 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116162157/https://www.oracle.com/java/technologies/javase/15-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 16 === |
|||
Дата релиза — 16 марта 2021 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* в синтаксис языка официально введены экспериментально добавленные в Java 14 возможности работы с записями (<code>record</code>) и использования <code>instanceof</code> в блоках <code>switch</code>; |
|||
* добавлен Foreign Linker API, предназначенный для замены механизма [[Java Native Interface|JNI]]; |
|||
* добавлен Foreign-Memory Access API, позволяющий Java-приложениям эффективно и безопасно использовать память вне [[куча (память)|кучи]] Java; |
|||
* добавлено динамическое освобождение [[Java Metaspace|Metaspace]] — области памяти, в которой хранится статическая информация Java-приложения (метаданные загруженных классов), и возвращение освобождённой памяти ОС; |
|||
* в [[Java Cryptography Architecture|JCA]] добавлена поддержка алгоритма [[SHA-3]]; |
|||
* в классах SocketChannel и ServerSocketChannel пакета java.nio.channels добавлена поддержка использования [[Сокет домена Unix|сокетов домена Unix]]; |
|||
* добавлено свойство jdk.tls.maxHandshakeMessageSize, позволяющее задать максимальный размер сообщения рукопожатия для протоколов [[TLS]]/[[DTLS]]; |
|||
* в интерфейс Stream добавлен метод toList, позволяющий преобразовывать поток в список; |
|||
* добавлен Vector API, предназначенный для использования возможностей [[Векторное исчисление|векторного исчисления]]; |
|||
* методы stop, destroy, isDestroyed, setDaemon, isDaemon класса ThreadGroup признаны [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]]; |
|||
* сборщик мусора ZGC может производить одновременную обработку [[стек]]ов разных потоков; |
|||
* сборщик мусора G1 может одновременно освобождать память, занимавшуюся разными потоками<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/16-relnote-issues.html|title=JDK 16 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116162157/https://www.oracle.com/java/technologies/javase/16-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 17 === |
|||
Дата релиза — 14 сентября 2021 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* в синтаксис языка официально введена экспериментально добавленная в Java 15 возможность работы с запечатанными (<code>sealed</code>) классами/интерфейсами; |
|||
* экспериментально расширена возможность использования блоков <code>switch</code> — в них можно выполнять разные действия в зависимости от того, к какому классу относится указанный объект, то есть метки case могут быть именами классов; |
|||
* в [[Генератор псевдослучайных чисел|генераторах псевдослучайных чисел]] (пакет java.util) добавлены новые алгоритмы/методы генерации; |
|||
* добавлен Foreign Function & Memory API, позволяющий Java-приложениям взаимодействовать с кодом и данными вне [[Java Runtime Environment|среды выполнения Java]]; |
|||
* в классе Console пакета java.io добавлен метод charset, возвращающий используемый [[Системная консоль|консолью]] набор символов; |
|||
* добавлено новое системное свойство native.encoding, позволяющее узнать обозначение (наименование) кодировки символов базовой среды [[хост]]а; |
|||
* в пакет java.time добавлен интерфейс InstantSource, позволяющий получать информацию о текущем моменте времени; |
|||
* в пакет java.util добавлен класс HexFormat, позволяющий преобразовывать числа [[Шестнадцатеричная система счисления|шестнадцатеричной системы счисления]] в числа других систем счисления (или строки) и обратно; |
|||
* в [[MacOS]] |
|||
** добавлена возможность использования нового конвейера [[рендеринг]]а 2D-графики [[Swing (библиотека)|Swing]] — Apple Metal; |
|||
** интерфейс UserDefinedFileAttributeView пакета java.nio.file.attribute расширен для возможнсти получения доступа к дополнительным атрибутам файлов; |
|||
* в классе FileSystemView пакета javax.swing.filechooser добавлен метод getSystemIcon, позволяющий загружать [[Иконка (графический интерфейс)|иконки]] высокого качества/разрешения; |
|||
* в классе DatagramSocket пакета java.net добавлены методы joinGroup и leaveGroup, предназначенные соответственно для присоединения к группе многоадресной рассылки или выхода из неё; |
|||
* исключён механизм активации [[RMI]]; |
|||
* в [[Java Virtual Machine|виртуальной машине Java]] [[HotSpot]] исключён код [[AOT-компиляция|AOT-компилятора]]<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/17all-relnotes.html|title=Consolidated JDK 17 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116220241/https://www.oracle.com/java/technologies/javase/17all-relnotes.html|url-status=live}}</ref>. |
|||
=== Java SE 18 === |
|||
Дата релиза — 22 марта 2022 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* во всех Java SE API кодировка по умолчанию изменена на [[UTF-8]]; |
|||
* добавлена утилита простого [[веб-сервер]]а jwebserver, запускаемая из [[Интерфейс командной строки|командной строки]]; |
|||
* улучшена безопасность при использовании методов [[Рефлексия (программирование)|рефлексии]]; |
|||
* добавлен интерфейс поставщика услуг для имени [[хост]]а и разбора [[Сетевой адрес|сетевого адреса]]; |
|||
* интерфейс JavaFileManager пакета javax.tools расширен 2 новыми методами — getJavaFileForOutputForOriginatingFiles и getFileForOutputForOriginatingFiles, которые используются для создания новых файлов на основании указанных исходных файлов; интерфейс Filer пакета javax.annotation.processing использует эти методы при создании новых файлов в той же манере; |
|||
* в класс Charset пакета java.nio.charset добавлена перегрузка метода forName, вторым аргументом которого может указываться наименование резервной кодировки, на случай отсутствия в системе (или невозможности определения) запрашиваемой первым аргументом; |
|||
* признаны [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]] |
|||
** механизмы финализации (методы finalize) разных классов; |
|||
** метод stop класса Thread; |
|||
* в сборщике мусора G1 максимальный размер обрабатываемых регионов [[куча (память)|кучи]] увеличен с 32 до 512 [[Мегабайт|Мб]]; |
|||
* в сборщиках мусора SerialGC, ParallelGC, ZGC добавлена поддержка [[Дедупликация|дедупликации]]<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/18-relnote-issues.html|title=JDK 18 Release Notes|accessdate=2024-01-16|archive-date=2023-04-18|archive-url=https://web.archive.org/web/20230418230858/https://www.oracle.com/java/technologies/javase/18-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 19 === |
|||
Дата релиза — 20 сентября 2022 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* добавлены экспериментальные возможности |
|||
** работы с виртуальными потоками; |
|||
** проверки, является ли передаваемый методу объект записью (<code>record</code>); |
|||
* добавлена поддержка [[Юникод#Версии Юникода|Unicode]] 14.0; |
|||
* в потоках вывода System.out и System.err добавлены новые свойства — stdout.encoding и stderr.encoding соответственно, которые определяют кодировку символов потока; |
|||
* добавлена поддержка токенов привязки каналов [[TLS]] при аутентификации по протоколам [[Kerberos]]/[[Negotiate]] через [[HTTPS]]; |
|||
* в классах DateTimeFormatter и DateTimeFormatterBuilder пакета java.time.format добавлены новые возможности определения форматов времени и дат; |
|||
* в классах HashMap, LinkedHashMap, WeakHashMap, HashSet, LinkedHashSet добавлены статические методы, позволяющие создавать новые хэш-таблицы; |
|||
* в классе SSLParameters пакета javax.net.ssl добавлены методы getSignatureSchemes и setSignatureSchemes, позволяющие соответственно получать и задавать схемы проверки [[электронная подпись|электронных цифровых подписей]] при соединениях по протоколам [[TLS]]/[[DTLS]]; |
|||
* изменено действие методов класса ThreadGroup: |
|||
** методы destroy и setDaemon не делают ничего; |
|||
** метод isDestroyed всегда возвращает false; |
|||
** методы suspend, resume и stop всегда выбрасывают [[Обработка исключений#Исключения|исключение]] UnsupportedOperationException; |
|||
* конструкторы класса Locale пакета java.util признаны [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]] — вместо них рекомендуется использовать статический метод of<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/19-relnote-issues.html|title=JDK 19 Release Notes|accessdate=2024-01-16|archive-date=2023-09-20|archive-url=https://web.archive.org/web/20230920091306/https://www.oracle.com/java/technologies/javase/19-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 20 === |
|||
Дата релиза — 21 марта 2023 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* при работах с потоками введена экспериментальная возможность использования ограниченных значений ([[Обобщённое программирование|параметризованный]] класс ScopedValue), которые могут эффективно и безопасно использоваться разными потоками; |
|||
* добавлена поддержка [[Юникод#Версии Юникода|Unicode]] 15.0; |
|||
* в классе SSLParameters пакета javax.net.ssl добавлены методы getNamedGroups и setNamedGroups, позволяющие в приоритетном порядке настраивать списки групп алгоритмов обмена ключами при соединениях по протоколам [[TLS]]/[[DTLS]]; |
|||
* изменено действие методов suspend, resume и stop класса Thread — они всегда выбрасывают [[Обработка исключений#Исключения|исключение]] UnsupportedOperationException; |
|||
* признаны [[Аннотация (Java)#Встроенные аннотации|устаревшими (deprecated)]] |
|||
** конструкторы класса URL пакета java.net — вместо них рекомендуется использовать новый статический метод of этого класса или методы toURL класса URI из того же пакета; |
|||
** используемые в [[Java-апплет]]ах классы MLet, MLetContent, PrivateMLet, MLetMBean пакета javax.management.loading; |
|||
* в сборщике мусора G1 улучшена параллельная обработка потоков<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/20-relnote-issues.html|title=JDK 20 Release Notes|accessdate=2024-01-16|archive-date=2023-09-12|archive-url=https://web.archive.org/web/20230912062028/https://www.oracle.com/java/technologies/javase/20-relnote-issues.html|url-status=live}}</ref>. |
|||
=== Java SE 21 === |
|||
Дата релиза — 19 сентября 2023 года<ref name="Java_language_changes_history"/>. |
|||
==== Изменения ==== |
|||
* в синтаксис языка официально введены ранее экспериментально добавленные возможности |
|||
** расширения использования блоков <code>switch</code> — в них можно выполнять разные действия в зависимости от того, к какому классу относится указанный объект, то есть метки case могут быть именами классов (с Java 17); |
|||
** проверки, является ли передаваемый методу объект записью (<code>record</code>) (с Java 19); |
|||
** работы с виртуальными потоками (с Java 19); |
|||
* добавлены [[Обобщённое программирование|параметризованные]] интерфейсы SequencedCollection, SequencedSet, SequencedMap для работы с коллекциями, в которых чётко определён порядок следования элементов; |
|||
* добавлен Key Encapsulation Mechanism API — механизм обеспечения надёжной работы с [[Симметричные криптосистемы|симметричными криптосистемами]]; |
|||
* добавлены экспериментальные возможности работы |
|||
** со строковыми шаблонами, в которых могут использоваться текстовые блоки; |
|||
** безымянными шаблонами и переменными, обозначемыми символом «_»; |
|||
** с безымянными классами — внутри java-файла можно без определения имени класса записать определение метода main; |
|||
* класс HttpClient пакета java.net.http теперь реализует интерфейс AutoCloseable; |
|||
* в классы Pattern пакета java.util.regex и String добавлены методы splitWithDelimiters, возвращающие строковые массивы, состоящие как из обычных символов, так и символов-разделителей; |
|||
* в классах StringBuilder и StringBuffer добавлены методы repeat, возвращающие повторённые указанное число раз последовательности символов; |
|||
* в классе Character добавлены новые методы работы с символами [[эмодзи]]; |
|||
* в классе ThreadGroup удалён метод allowThreadSuspension; |
|||
* удалён класс Compiler; |
|||
* в сборщике мусора ZGC добавлена раздельная обработка объектов [[Модель памяти Java|молодого и старого поколений]]<ref>{{Cite web|url=https://www.oracle.com/java/technologies/javase/21-relnote-issues.html|title=JDK 21 Release Notes|accessdate=2024-01-16|archive-date=2024-01-16|archive-url=https://web.archive.org/web/20240116230823/https://www.oracle.com/java/technologies/javase/21-relnote-issues.html|url-status=live}}</ref>. |
|||
== Классификация платформ Java == |
== Классификация платформ Java == |
||
Внутри Java существует несколько основных семейств технологий: |
Внутри Java существует несколько основных семейств технологий: |
||
* [[Java SE]] — Java Standard Edition |
* [[Java SE]] — Java Standard Edition — основное издание Java. Содержит компиляторы, [[API]], [[Java Runtime Environment]]; подходит для создания пользовательских приложений, в первую очередь — для настольных систем. |
||
* [[ |
* [[Jakarta EE]] (ранее — Java EE (Enterprise Edition)) представляет собой набор спецификаций для создания [[программное обеспечение|ПО]] уровня предприятия. В 2017-м проект Java EE был передан [[Eclipse Foundation]], и тогда же его наименование изменилось на текущее<ref>{{Cite news|title=Opening Up Java EE - An Update|first=David|last=Delabassee|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update|access-date=2018-11-25|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126010151/https://blogs.oracle.com/theaquarium/opening-up-ee-update}}</ref><ref>{{Cite news|title=And the Name Is…|url=https://eclipse-foundation.blog/2018/02/26/and-the-name-is/|work=Life at Eclipse|date=2018-02-26|access-date=2018-11-25|language=en|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126010008/https://eclipse-foundation.blog/2018/02/26/and-the-name-is/}}</ref>. Модули Java EE удалены из Java SE с 11-й версии<ref>{{Cite web|url=http://openjdk.java.net/jeps/320|title=JEP 320: Remove the Java EE and CORBA Modules|publisher=openjdk.java.net|accessdate=2018-11-25|archive-date=2018-11-24|archive-url=https://web.archive.org/web/20181124235611/http://openjdk.java.net/jeps/320|deadlink=no}}</ref>. |
||
* [[Java ME]] — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например, в [[мобильный телефон|мобильных телефонах]], [[Карманный персональный компьютер|КПК]], встроенных системах; |
* [[Java ME]] — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например, в [[мобильный телефон|мобильных телефонах]], [[Карманный персональный компьютер|КПК]], [[Встраиваемая система|встроенных системах]]; |
||
* [[Java Card]] — технология предоставляет безопасную среду для приложений, работающих на смарт- |
* [[Java Card]] — технология предоставляет безопасную среду для приложений, работающих на [[смарт-карта]]х и других устройствах с очень ограниченным объёмом памяти и возможностями обработки. |
||
== Java и Microsoft == |
== Java и Microsoft == |
||
Строка 218: | Строка 390: | ||
* наличие нестандартных расширений, таких, как средства интеграции Java и [[DCOM]], работающих только на платформе Windows. |
* наличие нестандартных расширений, таких, как средства интеграции Java и [[DCOM]], работающих только на платформе Windows. |
||
Тесная интеграция Java с DCOM и [[Windows API|Win32]] поставила под вопрос [[Кроссплатформенность|кроссплатформенную]] парадигму языка. Впоследствии это явилось поводом для судебных исков со стороны [[Sun Microsystems]] к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 |
Тесная интеграция Java с DCOM и [[Windows API|Win32]] поставила под вопрос [[Кроссплатформенность|кроссплатформенную]] парадигму языка. Впоследствии это явилось поводом для судебных исков со стороны [[Sun Microsystems]] к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года<ref name=msjvm>{{cite web |
||
|date = 2003-09-12 |
|date = 2003-09-12 |
||
|url = http://www.microsoft.com/About/Legal/EN/US/Interoperability/Java/Default.aspx |
|url = http://www.microsoft.com/About/Legal/EN/US/Interoperability/Java/Default.aspx |
||
Строка 230: | Строка 402: | ||
}}</ref>. |
}}</ref>. |
||
В 2005 |
В 2005 году компанией Microsoft для платформы [[.NET Framework|.NET]] был представлен Java-подобный язык [[Visual J Sharp|J#]], не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика [[Microsoft Visual Studio]], начиная с Visual Studio 2008<ref>{{cite web |
||
|date = 2007-11 |
|date = 2007-11 |
||
|url = http://msdn.microsoft.com/ru-ru/library/7xsxf8e2(VS.90).aspx |
|url = http://msdn.microsoft.com/ru-ru/library/7xsxf8e2(VS.90).aspx |
||
Строка 247: | Строка 419: | ||
Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код для использования их виртуальной машиной [[Dalvik virtual machine|Dalvik]] (начиная с [[Android Lollipop|Android 5.0 Lollipop]] виртуальная машина заменена на [[Android Runtime|ART]]). Для такой компиляции используется дополнительный инструмент, а именно Android SDK ([[SDK|Software Development Kit]]), разработанный компанией [[Google (компания)|Google]]. |
Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код для использования их виртуальной машиной [[Dalvik virtual machine|Dalvik]] (начиная с [[Android Lollipop|Android 5.0 Lollipop]] виртуальная машина заменена на [[Android Runtime|ART]]). Для такой компиляции используется дополнительный инструмент, а именно Android SDK ([[SDK|Software Development Kit]]), разработанный компанией [[Google (компания)|Google]]. |
||
Разработку приложений можно вести в среде [[Android Studio]], [[NetBeans]], в среде [[Eclipse (среда разработки)|Eclipse |
Разработку приложений можно вести в среде [[Android Studio]], [[NetBeans]], в среде [[Eclipse (среда разработки)|Eclipse]]. |
||
8 декабря 2014 года [[Android Studio]] признана компанией [[Google (компания)|Google]] официальной средой разработки под ОС Android. |
|||
== Применения платформы Java == |
== Применения платформы Java == |
||
Следующие успешные проекты реализованы с привлечением Java ([[J2EE]]) технологий: [[RuneScape]], [[Amazon]]<ref>{{cite web |
Следующие успешные проекты реализованы с привлечением Java ([[J2EE]]) технологий: [[RuneScape]], [[Amazon]]<ref>{{cite web |
||
| |
|author = Todd Hoff. |
||
| |
|date = 2007-09-18 |
||
| |
|url = http://highscalability.com/amazon-architecture |
||
| |
|title = Amazon Architecture |
||
| |
|accessdate = 2009-06-06 |
||
| |
|lang = en |
||
| |
|description = Обсуждение архитектуры Amazon с использованием Java-технологий |
||
|archive-date = 2009-02-28 |
|||
|archive-url = https://web.archive.org/web/20090228222248/http://highscalability.com/amazon-architecture |
|||
|deadlink = no |
|||
}}</ref><ref>{{cite web |
}}</ref><ref>{{cite web |
||
|url = http://aws.amazon.com/ec2/ |
|url = http://aws.amazon.com/ec2/ |
||
Строка 313: | Строка 486: | ||
}}</ref>. |
}}</ref>. |
||
Следующие компании в основном фокусируются на Java ([[J2EE]]) технологиях: [[SAP]], [[IBM]], [[Oracle]]. В частности, [[Система управления базами данных|СУБД]] [[Oracle Database]] включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, [[хранимая процедура|хранимые процедуры]]<ref>{{cite web |
Следующие компании в основном фокусируются на Java- ([[J2EE]]-) технологиях: [[SAP]], [[IBM]], [[Oracle]]. В частности, [[Система управления базами данных|СУБД]] [[Oracle Database]] включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, [[хранимая процедура|хранимые процедуры]]<ref>{{cite web |
||
|url = http://www.oracle.com/technology/tech/java/jsp/index.html |
|url = http://www.oracle.com/technology/tech/java/jsp/index.html |
||
|title = OracleJVM and Java Stored Procedures |
|title = OracleJVM and Java Stored Procedures |
||
Строка 325: | Строка 498: | ||
=== Производительность === |
=== Производительность === |
||
Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке C<ref name="slow_java"/>. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 |
Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке C<ref name="slow_java"/>. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 годах JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие, как внутренние классы, класс <code>StringBuffer</code><ref group="док.">{{Javadoc:SE|java.base/java/lang|StringBuffer}}</ref>, упрощённые логические вычисления и так далее). Кроме того, была произведена оптимизация виртуальной машины Java — с 2000 года для этого используется виртуальная машина [[HotSpot]]. По состоянию на февраль 2012 года код Java 7 приблизительно в 1,8 раза медленнее кода, написанного на языке Си<ref>{{cite web |
||
|url = http://shootout.alioth.debian.org/u32q/which-programming-languages-are-fastest.php?gcc=on&javasteady=on&java=on&csharp=on&javaxint=on&calc=chart |
|url = http://shootout.alioth.debian.org/u32q/which-programming-languages-are-fastest.php?gcc=on&javasteady=on&java=on&csharp=on&javaxint=on&calc=chart |
||
|title = Ubuntu: Intel® Q6600® quad-core Computer Language Benchmarks |
|title = Ubuntu: Intel® Q6600® quad-core Computer Language Benchmarks |
||
Строка 332: | Строка 505: | ||
}}</ref>. |
}}</ref>. |
||
Некоторые платформы предлагают аппаратную поддержку выполнения для Java<ref>{{Статья|автор=Wolfgang Puffitsch, Martin Schoeberl|заглавие=picoJava-II in an FPGA|ссылка=http://orbit.dtu.dk/files/4176066/pjfpga.pdf|язык=en|издание=DTU Library|тип=|год=2007|месяц=|число=|том=|номер=|страницы=|issn=}}</ref>. К примеру, микроконтроллеры, выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение |
Некоторые платформы предлагают аппаратную поддержку выполнения для Java<ref>{{Статья|автор=Wolfgang Puffitsch, Martin Schoeberl|заглавие=picoJava-II in an FPGA|ссылка=http://orbit.dtu.dk/files/4176066/pjfpga.pdf|язык=en|издание=DTU Library|тип=|год=2007|месяц=|число=|том=|номер=|страницы=|issn=|access-date=2018-12-02|archive-date=2018-12-02|archive-url=https://web.archive.org/web/20181202202734/http://orbit.dtu.dk/files/4176066/pjfpga.pdf|deadlink=no|archivedate=2018-12-02|archiveurl=https://web.archive.org/web/20181202202734/http://orbit.dtu.dk/files/4176066/pjfpga.pdf}}</ref>. К примеру, микроконтроллеры, выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байт-кода Java через опцию Jazelle. |
||
== Основные возможности == |
== Основные возможности == |
||
* [[Сборка мусора (программирование)|Автоматическое управление памятью]] |
* [[Сборка мусора (программирование)|Автоматическое управление памятью]]; |
||
* Расширенные возможности обработки исключительных ситуаций |
* Расширенные возможности обработки [[Обработка исключений|исключительных ситуаций]]; |
||
* Богатый набор средств фильтрации ввода-вывода |
* Богатый набор средств фильтрации ввода-вывода; |
||
* Набор стандартных коллекций: [[Индексный массив|массив]], [[Список (информатика)|список]], [[стек]] и |
* Набор стандартных [[Коллекция (программирование)|коллекций]]: [[Индексный массив|массив]], [[Список (информатика)|список]], [[стек]] и т.п; |
||
* Наличие простых средств создания сетевых приложений (в том числе с использованием [[Сетевой протокол|протокола]] [[RMI]]) |
* Наличие простых средств создания сетевых приложений (в том числе — с использованием [[Сетевой протокол|протокола]] [[RMI]]); |
||
* Наличие классов, позволяющих выполнять [[HTTP]]-запросы и обрабатывать ответы |
* Наличие классов, позволяющих выполнять [[HTTP]]-запросы и обрабатывать ответы; |
||
* Встроенные в язык средства создания многопоточных приложений, которые потом были портированы на многие языки |
* Встроенные в язык средства создания многопоточных приложений, которые потом были портированы на многие языки, например, [[Python]]; |
||
* Унифицированный доступ к [[База данных|базам данных]]: |
* Унифицированный доступ к [[База данных|базам данных]]: |
||
** на уровне отдельных [[SQL]]-запросов — на основе [[JDBC]], [[SQLJ]]; |
|||
** на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе {{нп1|Java Data Objects||en|Java Data Objects}} и [[Java Persistence API]]; |
|||
* Поддержка [[Обобщённое программирование|обобщений]] (с версии 1.5); |
|||
:* на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе {{нп1|Java Data Objects||en|Java Data Objects}} и [[Java Persistence API]]. |
|||
* Поддержка [[Лямбда-исчисление|лямбд]], [[Замыкание (программирование)|замыканий]], возможностей [[Функциональное программирование|функционального программирования]] (с Java 8). |
|||
* Поддержка обобщений (начиная с версии 1.5). |
|||
* Поддержка лямбд, замыканий, встроенные возможности функционального программирования (с 1.8). |
|||
== Основные идеи == |
== Основные идеи == |
||
Строка 360: | Строка 532: | ||
! Длина (в байтах) || Диапазон или набор значений |
! Длина (в байтах) || Диапазон или набор значений |
||
|- |
|- |
||
| boolean || 1 в массивах, 4 в переменных<ref>JVM не имеет поддержки для переменных типа boolean, поэтому они представляются в виде значений типа int. Однако массивы boolean[] поддерживаются. [http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909 VM Spec The Structure of the Java Virtual Machine]</ref>|| true, false |
| boolean || 1 в массивах, 4 в переменных<ref>JVM не имеет поддержки для переменных типа boolean, поэтому они представляются в виде значений типа int. Однако массивы boolean[] поддерживаются. [http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909 VM Spec The Structure of the Java Virtual Machine] {{Wayback|url=http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909 |date=20111124105915 }}</ref>|| true, false |
||
|- |
|- |
||
| byte || 1 || −128..127 |
| byte || 1 || −128..127 |
||
Строка 378: | Строка 550: | ||
|} |
|} |
||
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее, одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые [[Регистр процессора|регистры]] или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово <code>strictfp</code>, запрещающее повышение точности. |
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее, одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые [[Регистр процессора|регистры]] или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово <code>strictfp</code>, запрещающее повышение точности. Начиная с Java 17, запрет на повышение точности снова начал действовать, а ключевое слово <code>strictfp</code> было объявлено устаревшим<ref>{{cite web |url=https://openjdk.org/jeps/306 |lang=en |title=JEP 306: Restore Always-Strict Floating-Point Semantics |deadlink=no |access-date=2022-11-21 |archive-url=https://web.archive.org/web/20221121205320/https://openjdk.org/jeps/306 |archive-date=2022-11-21}}</ref>. |
||
==== Преобразования при математических операциях ==== |
==== Преобразования при математических операциях ==== |
||
Строка 387: | Строка 559: | ||
# Иначе оба операнда преобразуются к типу <code>int</code>. |
# Иначе оба операнда преобразуются к типу <code>int</code>. |
||
Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в [[Си (язык программирования)|Си]]/[[C++]]<ref>{{книга|автор=[[Бьярн Страуструп]].|заглавие=Язык программирования |
Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в [[Си (язык программирования)|Си]]/[[C++]]<ref>{{книга|автор=[[Бьярн Страуструп]].|заглавие=Язык программирования C++|оригинал=The C++ Programming Language|место=М.—СПб.|издательство= Бином, Невский диалект|год=2008||страниц=1104|isbn=5-7989-0226-2; ISBN 5-7940-0064-3; ISBN 0-201-70073-5|тираж=5000}}</ref>. |
||
=== Объектные переменные, объекты, ссылки и указатели === |
=== Объектные переменные, объекты, ссылки и указатели === |
||
Строка 400: | Строка 572: | ||
Foo b = new Foo(30); |
Foo b = new Foo(30); |
||
</source> |
</source> |
||
При присваиваниях, передаче в [[Подпрограмма|подпрограммы]] и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются [[Адрес памяти|адреса]] объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций [[ |
При присваиваниях, передаче в [[Подпрограмма|подпрограммы]] и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются [[Адрес памяти|адреса]] объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций [[Указатель (тип данных)#Действия над указателями|разыменовывания]] — этот доступ осуществляется так, как если бы объектная переменная была самим объектом. |
||
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование. |
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование. |
||
* Нельзя преобразовывать объект типа <code>int</code> или любого другого примитивного типа в указатель или ссылку и наоборот. |
* Нельзя преобразовывать объект типа <code>int</code> или любого другого примитивного типа в указатель или ссылку и наоборот. |
||
* Над ссылками запрещено выполнять операции <code>++</code>, <code>−−</code>, <code>+</code>, <code>−</code> или любые другие арифметические |
* Над ссылками запрещено выполнять операции <code>++</code>, <code>−−</code>, <code>+</code>, <code>−</code> или любые другие арифметические и логические операции (<code>&&</code>, <code>||</code>, <code>^^</code>). |
||
* Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано, а во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности. |
* Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано, а во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности. |
||
* В Java нет операций взятия адреса (<code>&</code>) или взятия объекта по адресу (<code>*</code>). [[Амперсанд#Прочие применения|Амперсанд]] (<code>&</code>) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»). Однако для булевых типов одиночный амперсанд означает «логическое и», отличающееся от двойного тем, что цепь проверок не прекращается при получении в выражении значения <code>false</code><ref>{{Cite web|url=https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.23|title=Java Language Specification|author=[[Гослинг, Джеймс|Джеймс Гослинг]], Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли, Даниел Смит|website=|subtitle=Chapter 15. Expressions|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-12-01}}</ref>. Например, <code>a == b && foo() == bar()</code> не повлечёт вызовов <code>foo()</code> и <code>bar()</code> в случае, если <code>a != b</code>, тогда как использование <code>&</code> — повлечёт в любом случае. |
* В Java нет операций взятия адреса (<code>&</code>) или взятия объекта по адресу (<code>*</code>). [[Амперсанд#Прочие применения|Амперсанд]] (<code>&</code>) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»). Однако для булевых типов одиночный амперсанд означает «логическое и», отличающееся от двойного тем, что цепь проверок не прекращается при получении в выражении значения <code>false</code><ref>{{Cite web|url=https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.23|title=Java Language Specification|author=[[Гослинг, Джеймс|Джеймс Гослинг]], Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли, Даниел Смит|website=|subtitle=Chapter 15. Expressions|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-12-01|archive-date=2018-12-01|archive-url=https://web.archive.org/web/20181201135332/https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.23|deadlink=no}}</ref>. Например, <code>a == b && foo() == bar()</code> не повлечёт вызовов <code>foo()</code> и <code>bar()</code> в случае, если <code>a != b</code>, тогда как использование <code>&</code> — повлечёт в любом случае. |
||
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: <code>null</code>). |
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: <code>null</code>). |
||
Строка 413: | Строка 585: | ||
==== Дублирование ссылок и клонирование ==== |
==== Дублирование ссылок и клонирование ==== |
||
При присваивании не происходит копирования объекта, так как объектные переменные — ссылочные. Так, если написать |
|||
Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать |
|||
<source lang="java"> |
<source lang="java"> |
||
Foo foo, bar; |
Foo foo, bar; |
||
. . . |
|||
… |
|||
bar = foo; |
bar = foo; |
||
</source> |
</source> |
||
то произойдёт копирование адреса из переменной <code>foo</code> в переменную <code>bar</code>. То есть <code>foo</code> и <code>bar</code> будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная <code>foo</code>, будет менять объект, с которым связана переменная <code>bar</code>, и наоборот. Если же необходимо получить именно ещё одну ''копию'' исходного объекта, пользуются или [[Метод (языки программирования)|методом]] (функцией-членом, в терминологии C++) <code>clone |
то произойдёт копирование адреса из переменной <code>foo</code> в переменную <code>bar</code>. То есть <code>foo</code> и <code>bar</code> будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная <code>foo</code>, будет менять объект, с которым связана переменная <code>bar</code>, и наоборот. Если же необходимо получить именно ещё одну ''копию'' исходного объекта, пользуются или [[Метод (языки программирования)|методом]] (функцией-членом, в терминологии C++) <code>clone()</code>, создающим копию объекта, или (реже) копирующим [[Конструктор (объектно-ориентированное программирование)|конструктором]] (конструкторы в Java не могут быть виртуальными, поэтому экземпляр класса-потомка будет неправильно скопирован конструктором класса-предка; метод клонирования вызывает нужный конструктор и тем самым позволяет обойти это ограничение). |
||
Метод <code>clone()</code><ref group="док.">{{Javadoc:SE|name=clone()|java.base/java/lang|Object|clone()}}</ref> требует, чтобы класс реализовывал [[Интерфейс (объектно-ориентированное программирование)|интерфейс]] <code>Cloneable</code><ref group="док.">{{Javadoc:SE|java/lang|Cloneable}}</ref>. Если класс реализует интерфейс <code>Cloneable</code>, по умолчанию <code>clone()</code> копирует все поля (''мелкая копия''). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод <code>clone()</code>. Определение и использование метода <code>clone()</code> часто является нетривиальной задачей<ref>{{Cite web|url=https://docs.oracle.com/en/java/javase/11/docs/ruwiki/api/java.base/java/lang/Object.html|title=Java API Reference|author=|website=|subtitle=Class Object|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-11-26}}</ref>. |
Метод <code>clone()</code><ref group="док.">{{Javadoc:SE|name=clone()|java.base/java/lang|Object|clone()}}</ref> требует, чтобы класс реализовывал [[Интерфейс (объектно-ориентированное программирование)|интерфейс]] <code>Cloneable</code><ref group="док.">{{Javadoc:SE|java/lang|Cloneable}}</ref>. Если класс реализует интерфейс <code>Cloneable</code>, по умолчанию <code>clone()</code> копирует все поля (''мелкая копия''). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод <code>clone()</code>. Определение и использование метода <code>clone()</code> часто является нетривиальной задачей<ref>{{Cite web|url=https://docs.oracle.com/en/java/javase/11/docs/ruwiki/api/java.base/java/lang/Object.html|title=Java API Reference|author=|website=|subtitle=Class Object|date=|publisher=docs.oracle.com|lang=en|accessdate=2018-11-26|archive-date=2018-11-26|archive-url=https://web.archive.org/web/20181126222346/https://docs.oracle.com/en/java/javase/11/docs/ruwiki/api/java.base/java/lang/Object.html|deadlink=no}}</ref>. |
||
==== Инициализация переменных ==== |
==== Инициализация переменных ==== |
||
Строка 427: | Строка 599: | ||
==== Сборка мусора ==== |
==== Сборка мусора ==== |
||
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована [[Сборка мусора (программирование)|сборка мусора]]. Традиционным приёмом, дающим сборщику мусора «намёк» на необходимость освобождения памяти, является присваивание переменной пустого значения <code>null</code>, что может оказаться эффективным при необходимости освободить более не требующийся объект, ссылка на который хранится в долгоживущем объекте<ref>{{Книга|автор=Scott Oaks|заглавие=Java Performance: The Definitive Guide: Getting the Most Out of Your Code|ссылка=https://books.google.ru/books?id=aIhUAwAAQBAJ&pg=PA195&lpg=PA195&dq=elementData%5B--size%5D+=+null;+//+Let+gc+do+its+work&source=bl&ots=E6Zs7rX4hE&sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&hl=ru&sa=X&ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ#v=onepage&q=elementData%5B--size%5D%20=%20null;%20//%20Let%20gc%20do%20its%20work&f=false| |
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована [[Сборка мусора (программирование)|сборка мусора]]. Традиционным приёмом, дающим сборщику мусора «намёк» на необходимость освобождения памяти, является присваивание переменной пустого значения <code>null</code>, что может оказаться эффективным при необходимости освободить более не требующийся объект, ссылка на который хранится в долгоживущем объекте<ref>{{Книга|автор=Scott Oaks|заглавие=Java Performance: The Definitive Guide: Getting the Most Out of Your Code|ссылка=https://books.google.ru/books?id=aIhUAwAAQBAJ&pg=PA195&lpg=PA195&dq=elementData%5B--size%5D+=+null;+//+Let+gc+do+its+work&source=bl&ots=E6Zs7rX4hE&sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&hl=ru&sa=X&ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ|издательство="O'Reilly Media, Inc."|год=2014-04-10|страниц=425|isbn=9781449363543|access-date=2021-08-09|archive-date=2021-07-21|archive-url=https://web.archive.org/web/20210721005409/https://books.google.ru/books?id=aIhUAwAAQBAJ&pg=PA195&lpg=PA195&dq=elementData%5B--size%5D+%3D+null%3B+%2F%2F+Let+gc+do+its+work&source=bl&ots=E6Zs7rX4hE&sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&hl=ru&sa=X&ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ#v=onepage&q=elementData%5B--size%5D%20=%20null;%20//%20Let%20gc%20do%20its%20work&f=false|url-status=live|archive-date=2021-07-21|archive-url=https://web.archive.org/web/20210721005409/https://books.google.ru/books?id=aIhUAwAAQBAJ&pg=PA195&lpg=PA195&dq=elementData%5B--size%5D+%3D+null%3B+%2F%2F+Let+gc+do+its+work&source=bl&ots=E6Zs7rX4hE&sig=g8RiFVjoILKL2o7mWRNrUWt_ytw&hl=ru&sa=X&ved=2ahUKEwiBjvCGv_7eAhWUhaYKHfNaA-wQ6AEwCHoECAUQAQ#v=onepage&q=elementData%5B--size%5D%20=%20null;%20//%20Let%20gc%20do%20its%20work&f=false}}</ref>. Это, однако, не значит, что объект, заменённый значением <code>null</code>, будет непременно и немедленно удалён, но есть гарантия, что этот объект будет удалён именно в будущем. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удалён сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы. |
||
=== Классы и функции === |
=== Классы и функции === |
||
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» ({{lang-en|member function}}), а только ''метод''. В методы превратились и стандартные функции. Например, в Java нет функции <code>sin()</code>, а есть метод <code>Math.sin()</code> класса <code>Math</code> (содержащего, кроме <code>sin()</code>, методы <code>cos()</code>, <code>exp()</code>, <code>sqrt()</code>, <code>abs()</code> и многие другие) |
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» ({{lang-en|member function}}), а только ''метод''. В методы превратились и стандартные функции. Например, в Java нет функции <code>sin()</code>, а есть метод <code>Math.sin()</code> класса <code>Math</code> (содержащего, кроме <code>sin()</code>, методы <code>cos()</code>, <code>exp()</code>, <code>sqrt()</code>, <code>abs()</code> и многие другие). |
||
Как и в языке [[Си (язык программирования)|C]], любая исполняемая программа на Java должна иметь [[Си (язык программирования)#Точка входа программы|точку входа]], которой является функция с именем main — она должна быть единственной в программе и, в отличие от Си, всегда статической. При этом, начиная с Java 21, в которой были введены безымянные классы, допускается определять метод main (точку входа), не определяя имени главного класса. |
|||
Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод <code>finalize()</code> ни в коем случае нельзя считать аналогом деструктора. |
|||
==== Конструкторы ==== |
==== Конструкторы ==== |
||
Строка 484: | Строка 660: | ||
==== Завершённость (final) ==== |
==== Завершённость (final) ==== |
||
Ключевое слово <code>final</code> (финальный) имеет разные значения при описании поля, метода или класса. |
Ключевое слово <code>final</code> (финальный) имеет разные значения при описании поля, метода или класса. |
||
# Финальное '''поле''' класса инициализируется при описании или в конструкторе класса (а статическое поле — в статическом блоке инициализации). Впоследствии его значение не может быть изменено. Если статическое поле класса или переменная проинициализированы константным выражением, они рассматриваются компилятором как [[константа (программирование)|именованная константа]]; в таком случае их значение может быть использовано в [[Switch (оператор)|операторах <code>switch</code>]] (для констант |
# Финальное '''поле''' класса инициализируется при описании или в конструкторе класса (а статическое поле — в статическом блоке инициализации). Впоследствии его значение не может быть изменено. Если статическое поле класса или переменная проинициализированы константным выражением, они рассматриваются компилятором как [[константа (программирование)|именованная константа]]; в таком случае их значение может быть использовано в [[Switch (оператор)|операторах <code>switch</code>]] (для констант типов <code>int</code> и <code>String</code>, в том числе — элементов [[Перечисляемый тип#Java|перечислений]]), а также для условной компиляции (для констант типа <code>boolean</code>) при использовании с [[Условный оператор|оператором <code>if</code>]]. |
||
# Значения '''локальных переменных''', а также '''параметров метода''', помеченных ключевым словом <code>final</code>, не могут быть изменены после присвоения. При этом их значения могут использоваться внутри [[Внутренний класс#Анонимные (безымянные) классы|анонимных классов]]. |
# Значения '''локальных переменных''', а также '''параметров метода''', помеченных ключевым словом <code>final</code>, не могут быть изменены после присвоения. При этом их значения могут использоваться внутри [[Внутренний класс#Анонимные (безымянные) классы|анонимных классов]]. |
||
# '''Метод''' класса, отмеченный словом <code>final</code>, не может быть переопределён при наследовании. |
# '''Метод''' класса, отмеченный словом <code>final</code>, не может быть переопределён при наследовании. |
||
Строка 495: | Строка 671: | ||
==== Интерфейсы ==== |
==== Интерфейсы ==== |
||
Высшей степенью абстрактности в Java является интерфейс (модификатор <code>interface</code>). |
Высшей степенью абстрактности в Java является интерфейс (модификатор <code>interface</code>). Интерфейс содержит преимущественно абстрактные методы, имеющие всеобщий уровень доступа: описатели <code>abstract</code> и <code>public</code> для них даже не требуются. Однако с версий Java 8 и 9 были введены возможности использования в интерфейсах |
||
— Java 8: статических (<code>static</code>) методов и методов по умолчанию (<code>default</code>); |
|||
В Java класс не может наследовать более одного класса, зато может реализовывать несколько интерфейсов. Множественное наследование интерфейсов не запрещено, то есть один интерфейс может наследоваться от нескольких. |
|||
— Java 9: методов, имеющих уровень доступа <code>private</code>. |
|||
Эти методы содержат тело, а значит абстрактными не являются, но в конкретной реализации интерфейса <code>default</code>-методы могут быть переопределены. |
|||
Интерфейс в Java не считается классом, хотя, по сути, является полностью абстрактным классом. |
|||
Класс может наследовать/''расширять'' (<code>extends</code>) другой класс или ''реализовывать'' (<code>implements</code>) интерфейс. Интерфейсы же могут наследовать/расширять другие интерфейсы. В Java класс не может наследовать более одного класса, зато может реализовывать несколько интерфейсов. Множественное наследование интерфейсов не запрещено — один интерфейс может наследоваться от нескольких. |
|||
С версии Java 15 (экспериментально, официально — с версии Java 17) добавлена возможность использования запечатанных (<code>sealed</code>) классов/интерфейсов, при объявлении которых, с помощью ключевого слова <code>permits</code>, можно указывать, какие классы/интерфейсы могут наследовать данный запечатанный класс/интерфейс. |
|||
Интерфейсы можно использовать в качестве типов параметров методов. Нельзя создавать экземпляры интерфейсов. |
Интерфейсы можно использовать в качестве типов параметров методов. Нельзя создавать экземпляры интерфейсов. |
||
Строка 537: | Строка 723: | ||
=== Обработка ошибок === |
=== Обработка ошибок === |
||
Обработка ошибок в Java похожа на обработку ошибок в [[C++]] |
Обработка ошибок в Java похожа на обработку ошибок в [[C++]] за исключением необходимости в блоке <code>finally</code>. Данное отличие обусловлено тем, что Java не может придерживаться концепции [[Получение ресурса есть инициализация|RAII]] из-за наличия сборщика мусора, а автоматическое освобождение ресурсов в деструкторе может идти в непредсказуемом порядке через произвольные промежутки времени. |
||
Осуществляется обработка ошибок с помощью операторов <code>try</code>, <code>catch</code> и <code>finally</code>. Выбрасываемая ошибка описывается объектом определённого класса, наследующегося от <code>Throwable</code><ref group="док.">{{Javadoc:SE|java.base/java/lang|Throwable}}</ref> и соответствующего типу ошибки. Внутрь блока <code>try</code> помещается код, который может выбросить исключение, а блок <code>catch</code> отлавливает заданные программистом типы ошибок. При этом можно указывать более одного блока <code>catch</code> для обработки различных классов ошибок, или multi-catch для обработки нескольких ошибок. Блок <code>finally</code> является необязательным, но при наличии выполняется независимо от возникновения ошибки и предназначен для освобождения выделенных в ходе работы блока <code>try</code> ресурсов. |
Осуществляется обработка ошибок с помощью операторов <code>try</code>, <code>catch</code> и <code>finally</code>. Выбрасываемая ошибка описывается объектом определённого класса, наследующегося от <code>Throwable</code><ref group="док.">{{Javadoc:SE|java.base/java/lang|Throwable}}</ref> и соответствующего типу ошибки. Внутрь блока <code>try</code> помещается код, который может выбросить исключение, а блок <code>catch</code> отлавливает заданные программистом типы ошибок. При этом можно указывать более одного блока <code>catch</code> для обработки различных классов ошибок, или multi-catch для обработки нескольких ошибок. Блок <code>finally</code> является необязательным, но при наличии выполняется независимо от возникновения ошибки и предназначен для освобождения выделенных в ходе работы блока <code>try</code> ресурсов. |
||
Строка 561: | Строка 747: | ||
System.err.println("Указанный файл не найден."); |
System.err.println("Указанный файл не найден."); |
||
} |
} |
||
// |
// finally { |
||
// reader.close(); // автоматическое закрытие ресурса |
// reader.close(); // автоматическое закрытие ресурса |
||
// } |
// } |
||
Строка 568: | Строка 754: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
Java придерживается концепции обязательного указания классов ошибок, которые может выбросить метод. Делается это с помощью ключевого слова <code>throws</code> после описания метода. Если в методе не указать класс исключения (или его предка), которое может быть выброшено из метода, то это вызовет ошибку компиляции. Концепция должна была позволить делать код самодокументируемым, обозначая, какие исключения может выбросить тот или иной метод, но на практике редко себя оправдывает, поскольку в силу разных обстоятельств программист может указать в качестве выбрасываемого исключения класс <code>Exception</code> |
Java придерживается концепции обязательного указания классов ошибок, которые может выбросить метод. Делается это с помощью ключевого слова <code>throws</code> после описания метода. Если в методе не указать класс исключения (или его предка), которое может быть выброшено из метода, то это вызовет ошибку компиляции. Концепция должна была позволить делать код самодокументируемым, обозначая, какие исключения может выбросить тот или иной метод, но на практике редко себя оправдывает, поскольку в силу разных обстоятельств программист может указать в качестве выбрасываемого исключения класс <code>Exception</code> либо заключить проблемные части метода в блок <code>try</code>…<code>catch</code> для игнорирования отдельных ошибок, либо — в блок <code>try</code>…<code>finally</code>, скрывая все возможные ошибки. Недостатком концепции также является и то, что программист сам должен определять и прописывать исключения, которые может выбрасывать метод<ref>{{Cite web|url=https://www.artima.com/intv/handcuffs.html|title=The Trouble with Checked Exceptions|publisher=www.artima.com|accessdate=2018-12-21|archive-date=2019-01-08|archive-url=https://web.archive.org/web/20190108114501/https://www.artima.com/intv/handcuffs.html|deadlink=no}}</ref>. |
||
=== Пространство имён === |
=== Пространство имён === |
||
{{стиль раздела}} |
|||
{{main|Пространство имён (программирование)}} |
{{main|Пространство имён (программирование)}} |
||
Идея пространств имён воплощена в [[Package (Java)|Java-пакетах]]. |
Идея пространств имён воплощена в [[Package (Java)|Java-пакетах]]. |
||
Название Java-пакета |
Название Java-пакета создаётся [[латинский алфавит|латиницей]] (используется нижний и верхний регистр) с [[цифры|цифрами]] (они не должны быть первыми в строке) и знаком подчёркивания (он не должен быть первым и последним в строке), не являющейся инструкциями языка (например, <code>if</code>, <code>null</code>), разделённой точками. |
||
Правильные примеры названий: |
Правильные примеры названий: |
||
Строка 588: | Строка 772: | ||
* <code>нестандартный.язык</code> (не латиница) |
* <code>нестандартный.язык</code> (не латиница) |
||
* <code>0first.characret.is.number</code> (число в начале) |
* <code>0first.characret.is.number</code> (число в начале) |
||
* <code>contains.white space</code> (пробел) |
* <code>contains.white space</code> (пробел вместо точки) |
||
* <code>true.asd</code> (содержит <code>true</code>, см. выше) |
* <code>true.asd</code> (содержит <code>true</code>, см. выше) |
||
Пакеты содержат классы, интерфейсы, перечисления, аннотации (и т. д.), имена которых |
Пакеты содержат классы, интерфейсы, перечисления, аннотации (и т. д.), имена которых тоже создаются латиницей (используется нижний и верхний регистр) с цифрами (они не должны стоять первыми в строке). Публичный класс, интерфейс (и т. д.) в одном файле может быть только один. Имя публичного класса, интерфейса (и т. д.) в файле должно совпадать с названием файла. Каждый класс имеет своё пространство имён для функций, переменных и подклассов, подинтерфейсов (и т. д.), причём получить подкласс класса можно с помощью <code>OuterClass.InnerClass</code>, а можно — с помощью <code>OuterClass$InnerClass</code>, поэтому использование символа доллара в названии класса не рекомендуется. |
||
== Примеры программ == |
== Примеры программ == |
||
Код программы [[Hello, world! |
Код программы «[[Hello, world!]]». |
||
<source lang="java" line="1"> |
<source lang="java" line="1"> |
||
class HelloWorld { |
class HelloWorld { |
||
public static void main(String[] args) { |
public static void main(String[] args) { |
||
System.out.println("Hello |
System.out.println("Hello, world!"); |
||
} |
} |
||
} |
} |
||
Строка 694: | Строка 878: | ||
== Средства разработки ПО == |
== Средства разработки ПО == |
||
* [[JDK]] — помимо набора библиотек для платформ [[Java SE]] и [[Java EE]], содержит компилятор командной строки javac и набор утилит, |
* [[JDK]] — помимо набора библиотек для платформ [[Java SE]] и [[Java EE]], содержит компилятор командной строки javac и набор утилит, так же работающих в режиме командной строки. |
||
* [[NetBeans IDE]] — свободная интегрированная среда разработки для всех платформ Java — [[Java ME]], [[Java SE]] и [[Java EE]]. Пропагандируется [[Oracle]], владельцем технологии Java, как базовое средство для разработки ПО на языке Java и других языках ([[Си (язык программирования)|C]], [[C++]], [[PHP]], [[Fortran]] и др.). |
* [[NetBeans IDE]] — свободная интегрированная среда разработки для всех платформ Java — [[Java ME]], [[Java SE]] и [[Java EE]]. Пропагандируется [[Oracle]], владельцем технологии Java, как базовое средство для разработки ПО на языке Java и других языках ([[Си (язык программирования)|C]], [[C++]], [[PHP]], [[Fortran]] и др.). |
||
* [[Eclipse (среда разработки)|Eclipse IDE]] — свободная интегрированная среда разработки для [[Java SE]], [[Java EE]] и [[Java ME]]<ref>{{cite web |
* [[Eclipse (среда разработки)|Eclipse IDE]] — свободная интегрированная среда разработки для [[Java SE]], [[Java EE]] и [[Java ME]]<ref>{{cite web |
||
Строка 761: | Строка 945: | ||
}} |
}} |
||
* {{книга |
* {{книга |
||
|заглавие = Руководство для программиста на Java: 75 рекомендаций по написанию |
|заглавие = Руководство для программиста на Java: 75 рекомендаций по написанию надёжных и защищённых программ |
||
|оригинал = Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs |
|оригинал = Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs |
||
|автор = Фрэд Лонг, Дхрув Мохиндра, Роберт С. Сикорд, Дин Ф. Сазерленд, Дэвид Свобода |
|автор = Фрэд Лонг, Дхрув Мохиндра, Роберт С. Сикорд, Дин Ф. Сазерленд, Дэвид Свобода |
||
Строка 866: | Строка 1050: | ||
== Ссылки == |
== Ссылки == |
||
*[https://docs.oracle.com/javase/tutorial/ The Java Tutorials]{{Ref-en}} |
* [https://docs.oracle.com/javase/tutorial/ The Java Tutorials]{{Ref-en}} — обучающие материалы по Java 8 |
||
*[https://web.archive.org/web/20090903064925/http://www.mindview.net/Books/DownloadSites Bruce Eckel’s Free Electronic Books]{{ref-en}} — свободно распространяемые электронные версии книг Брюса Эккеля по C++ и Java вместе с исходным кодом |
* [https://web.archive.org/web/20090903064925/http://www.mindview.net/Books/DownloadSites Bruce Eckel’s Free Electronic Books]{{ref-en}} — свободно распространяемые электронные версии книг Брюса Эккеля по C++ и Java вместе с исходным кодом |
||
* W. Kahan, Joseph D. Darcy. [http://www.eecs.berkeley.edu/~wkahan/JAVAhurt.pdf How Java’s Floating-Point Hurts Everyone Everywhere{{Ref-en}}] |
|||
* [https://urvanov.ru/2016/03/23/учебник-java-8/ Учебник Java 8] |
* [https://urvanov.ru/2016/03/23/учебник-java-8/ Учебник Java 8] |
||
*[https://www.java.com/ru/ Официальный сайт Java] |
* [https://www.java.com/ru/ Официальный сайт Java] |
||
{{Внешние ссылки}} |
{{Внешние ссылки}} |
Текущая версия от 15:53, 19 декабря 2024
Java | |
---|---|
Класс языка | |
Появился в | 1995 |
Автор | Джеймс Гослинг и Sun Microsystems |
Разработчик | Sun Microsystems и Oracle[1] |
Расширение файлов | .java, .class, .jar, .jad, .jmod, .war, .ear |
Выпуск | Java SE 23[2] (17.09.2024) |
Испытал влияние | C++, Си, Ада, Simula 67[вд], Smalltalk, Objective-C, Object Pascal, Оберон, Eiffel, Модула-3, Mesa[вд], Симула, C#, UCSD Pascal, обёртка[вд], Вариативная функция, аннотация Java, Никлаус Вирт, Патрик Нотон[вд] и foreach[вд] |
Повлиял на | Ada, C#, Chapel, Clojure, ECMAScript, Fantom, Gambas, Groovy, Hack, Haxe, J#, Kotlin, PHP, Python, Scala, Seed7, Vala, JavaScript |
Лицензия | GNU GPL[3] |
Сайт | oracle.com/ru/java/ |
Медиафайлы на Викискладе |
Java[прим. 1] — строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process; язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Java занимает высокие места в рейтингах популярности языков программирования (2-е место в рейтингах IEEE Spectrum (2020)[4] и TIOBE (2021[5]).
История создания
[править | править код]Изначально язык назывался Oak («Дуб»), разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java[6]. Назван в честь марки кофе Java, которая, в свою очередь, получила наименование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с аллюзией на кофемашину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось.
В результате работы проекта мир увидел принципиально новое устройство, карманный персональный компьютер Star7[7], который опередил своё время более чем на 10 лет, но из-за большой стоимости в 50 долларов не смог произвести переворот в мире технологии и был забыт.
Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. Однако в 1994 году стало очевидным, что интерактивное телевидение было ошибкой.
С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же определённое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко.
В веб-разработке применяется Spring Framework; для документирования используется утилита Javadoc.
Основные особенности языка
[править | править код]Программы на Java транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований немного увеличил скорость выполнения программ на Java:
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- обширное использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами архитектуры ARM).
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, но при этом в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее[8]. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++[9][10][11].
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине[12]. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы .NET компанией Microsoft.
История версий
[править | править код]Этот раздел нужно проверить на соответствие критериям взвешенности изложения. |
JDK 1.0
[править | править код]Разработка Java началась в 1990 году, первая официальная версия — Java 1.0 — была выпущена 23 января 1996 года[13].
JDK 1.1
[править | править код]Вторая версия была выпущена 19 февраля 1997 года[14].
- Библиотека Accessibility.
- Java 2D.
- Поддержка технологии drag-and-drop.
- Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.
- Поддержка воспроизведения аудиофайлов нескольких популярных форматов.
- Полная поддержка технологии CORBA.
- JIT-компилятор, улучшенная производительность.
- Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ.
J2SE 1.2
[править | править код]Дата выпуска — 8 декабря 1998 года[15]. Кодовое имя — Playground. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по J2SE 1.2 (бывшее название — Java 2). Вместе с тем, по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределённые приложения (2011).
В то время, когда Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если J2SE 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, что приводит к путанице.
J2SE 1.3
[править | править код]Дата выпуска — 8 мая 2000 года. Кодовое имя — Kestrel.
J2SE 1.4
[править | править код]Дата выпуска — 13 февраля 2002 года. Кодовое имя — Merlin.
J2SE 5.0
[править | править код]Спецификация Java 5.0 была выпущена 30 сентября 2004 года, кодовое имя — Tiger. C этой версии изменена официальная индексация, вместо Java 1.5 правильнее называть Java 5.0. Внутренняя же индексация Sun осталась прежней — 1.x. Малые изменения теперь включаются без изменения индексации, для этого используется слово «Update» или буква «u», например, Java Development Kit 5.0 Update 22. Предполагается, что в обновления могут входить как исправления ошибок, так и небольшие добавления в API, JVM.
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
- Перечислимые типы (англ. enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
- Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе — скрытые и абстрактные.
- Перечисление может реализовывать интерфейсы.
- Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым.
- Аннотации — возможность добавления в текст программы метаданных, непосредственно не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода.
- Средства обобщённого программирования (англ. generics) — механизм, аналогичный средствам языков Ada[16] и Eiffel (позже также появились и в C#, принципиально отличаются от шаблонов C++), дающий возможность создавать классы и методы с полями и параметрами произвольного объектного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.
- Методы с неопределённым числом параметров.
- Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-обёртками (например, между int — Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.
- Разрешён импорт статических полей и методов.
- В язык введён цикл по коллекции объектов (итератор, англ. foreach).
- Введено использование Javadoc-комментариев, которые используются для автоматического оформления документации по комментариям в исходном коде.
Java SE 6
[править | править код]Релиз версии состоялся 11 декабря 2006 года, кодовое имя — Mustang. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Малые изменения, как и в Java 5.0, вносятся в обычные обновления версии, например, Java Standard Edition Development Kit 6 Update 27. Внесены следующие изменения:
- Коллекции — добавлены интерфейсы для организации:
- двухсторонних очередей, в том числе — блокирующих себя во время ожидания элемента;
- множеств и словарей, организовывающих поиск по ближайшему соответствию (Navigable Set/Navigable Map).
При этом организованы новые классы, реализующие перечисленные интерфейсы[17].
- Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями).
- Доступны классы-потоки для чтения и передачи сжатых данных, с возможностью передачи их по сети. Сняты ограничения на количество файлов в архиве (ранее — 64 Кб), длину названия файла (ранее — 256 символов) и количество одновременно открытых файлов (ранее — 2000 шт).
- Организована система управления кэшем и добавлена поддержка параметра «no-cache» в HTTP-запросе.
- JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой.
- Java HTTP Server позволяет создать полноценный HTTP-сервер, с минимально необходимыми функциональными свойствами.
- Повысилась скорость вычислений на 70 %, скорость операций ввода-вывода возросла в два раза[18].
- Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами формата GIF.
- Исправлено большое количество ошибок.
Дата выпуска — 8 октября 2013 года.
JavaFX 2.2 вошёл в состав Java SE 7 update 6[19]. С 11-й версии модуль поставляется отдельно от JDK[20].
Java ME Embedded
[править | править код]Дата выпуска — 10 октября 2013 года. Кодовое имя — Micro Edition.
Java SE 7
[править | править код]Релиз версии состоялся 28 июля 2011 года, кодовое имя — Dolphin[21]. В финальную версию Java Standard Edition 7 не были включены все ранее запланированные изменения. Согласно плану развития (план «Б»)[22], включение нововведений будет разбито на две части: Java Standard Edition 7 (без лямбда-исчисления, проекта Jigsaw, и части улучшений проекта Coin[23]) и Java Standard Edition 8 (всё остальное), намеченный на конец 2012 года.
В новой версии, получившей название Java Standard Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок, было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standard Edition 7 использован не проприетарный пакет JDK, а его открытая реализация OpenJDK, а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров Oracle с участниками мировой экосистемы Java, комитетом JCP (Java Community Process) и сообществом OpenJDK. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standard Edition 7 собраны на основе кодовой базы OpenJDK, сама эталонная реализация полностью открыта под лицензией GPLv2 с исключениями GNU ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям относятся:
- интеграция набора небольших языковых улучшений Java, развиваемых в рамках проекта Coin,
- добавлена поддержка языков программирования с динамической типизацией, таких, как Ruby, Python и JavaScript,
- поддержка загрузки классов по URL,
- обновлённый XML-стек, включающий JAXP 1.4, JAXB 2.2a и JAX-WS 2.2 и другие[24].
За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом[25].
Список нововведений
[править | править код]- Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java[26] для поддержки динамически-типизированных языков.
- Строгая проверка class-файлов — class-файлы версии 51 (Java Standard Edition 7) или более поздней версии должны быть проверены typechecking-верификатором; JVM не должна переключаться на старый верификатор.
- Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования:
- Использование класса
String
[док. 1] в блокеswitch
. - Закрытие используемых ресурсов в блоке
try
(try-with-resources) — работает при использовании интерфейсаAutoClosable
[док. 2]. - Объединённая обработка исключений в блоке
catch
(multi-catch exceptions) — перечисление обрабатываемых исключений вcatch
(… | … | …). - Повторное выбрасывание исключений (rethrowing exceptions) — передача возникшего исключения «вверх» по стеку вызовов.
- Подчёркивания в числовых литералах для лучшего восприятия больших чисел.
- Изменение вывода типа в Java generic при создании объекта.
- Использование двоичных чисел (binary literals) — префикс
0b
укажет, что используется двоичное число. - Упрощение вызова методов varargs — уменьшение предупреждений при вызове метода с переменным числом входящих переменных.
- Использование класса
- Модификация загрузчика классов (class-loader) — избежание тупиковых ситуаций в неиерархической топологии загрузки классов.
- Закрытие ресурсов, открытых
URLClassLoader
[док. 3]. - Обновление коллекций (JSR 166).
- Поддержка Unicode 6.0.
- Отделение языка пользователя и языка пользовательского интерфейса — обновление обработки языков для отделения локали от языка пользовательского интерфейса.
- Новые интерфейсы I/O для платформы Java (nio.2).
- Использование JDBC 4.1 и Rowset 1.1.
- … (не закончено)
Java SE 8
[править | править код]Релиз версии состоялся 19 марта 2014 года. Кодовое имя — Octopus.
Список нововведений
[править | править код]- Полноценная поддержка лямбда-выражений.
- Ключевое слово
default
в интерфейсах для поддержки функциональности по умолчанию. - Статические методы в интерфейсах.
- Ссылки на методы и конструкторы[27][28].
- Функциональные интерфейсы (предикаты, поставщики и т. д.)
- Потоки (stream) для работы с коллекциями.
- Новый API для работы с датами.
- … (не закончено)
Java SE 9
[править | править код]В связи со сложностями в реализации модульной системы в рамках проекта Jigsaw, релиз версии, первоначально запланированный 22 сентября 2016 года, несколько раз откладывался: сначала дата была перенесена на 23 марта 2017 года, потом — на 27 июля 2017 года, а затем — на 21 сентября 2017 года[29][30][31].
Последняя дата стала официальной датой релиза версии[32].
Список нововведений
[править | править код]- Интеграция Jigsaw, в рамках которого разработана модульная система для платформы Java 9 и применена к JDK 9[33].
- Обновление Process API для улучшения взаимодействия с процессами операционной системы. Обновление мотивировано тем, что разработчикам зачастую приходилось писать платформозависимый код для таких задач[34].
- Временно экспериментальный[35][36] новый HTTP-клиент с поддержкой HTTP/2 и веб-сокетов; предназначен заменить устаревший класс
HttpURLConnection
[док. 4][35]. - Сжатые строки: если содержимое строки позволяет, она может кодироваться в Latin-1 (один байт на символ); выбор кодировки конкретного экземпляра класса
String
отображается в значении переменной-флага, которая теперь есть у всех строк.[37] - Поддержка указанных в NIST FIPS 202 алгоритмов хеширования SHA-3, кроме SHAKE128 и SHAKE256. Алгоритмы использования SHA-3 в качестве основы для других криптографических функций не реализованы в силу отсутствия соответствующих стандартов[38].
- Улучшены средства для пометки устаревшего API. В аннотацию
@Deprecated
добавлен параметр, позволяющий указывать версию программы, с которой использование отмеченного элемента не рекомендуется, а также — параметр, позволяющий указать, что запланировано удаление элемента в какой-либо из будущих версий[39]. private
методы в интерфейсах[40].- Поддержка GTK+ 3 на Linux[41].
Java SE 10
[править | править код]Дата релиза: 20 марта 2018 года[42].
Список нововведений
[править | править код]Официальный частичный список нововведений и план релиза расположен на сайте OpenJDK.
- Вывод типов локальных переменных, помеченных с помощью ключевого слова
var
[43]. - Создание прозрачного интерфейса сборщика мусора для упрощения разработки новых сборщиков[44].
- Уменьшено время задержек многопоточного сборщика мусора G1 за счёт реализации параллельного полного цикла сборки мусора[45].
- Возможность выполнять функции обратного вызова на потоках, не делая глобальных блокировок[46] в рамках всех потоков[47].
- Поддержка символов из новых расширений Unicode: cu (тип валюты), fw (первый день недели), rg (двухбуквенные коды стран и регионов), tz (часовой пояс)[48].
- HotSpot VM теперь может выделять память кучи для объектов на альтернативных устройствах оперативной памяти, в том числе тех, которые обладают энергонезависимой памятью, как, например, накопители Intel Optane Memory[49].
- Новый экспериментальный JIT-компилятор Graal, предоставляющий возможности Ahead-of-Time компиляции; по умолчанию отключён, работает только на Linux/x64[50].
- Обновление системы нумерации версий Java SE и JDK с целью приближения к схеме управления версиями по времени[51].
Java SE 11
[править | править код]Официальный частичный список нововведений и план релиза расположен на сайте OpenJDK. Дата релиза — 25 сентября 2018 года.
Список нововведений
[править | править код]- Обновление системы управления доступом, позволяющее вложенным классам обращаться к закрытым (private) методам и полям внешнего класса (и наоборот) без необходимости создания компилятором промежуточных методов с повышением уровня доступа[52].
- Epsilon — новый сборщик мусора, собственно сборкой мусора не занимающийся вообще; при использовании Epsilon превышение предела выделяемой памяти приводит к завершению работы JVM[53].
- Стандартизирован клиент HTTP с поддержкой HTTP/2, введённый в Java 9 как экспериментальный[54].
- Параметры лямбда-функций могут быть неявно типизированы путём вывода типов через ключевое слово (
var
) для унификации с синтаксисом локальных переменных, введённым в JDK 10[55]. - Поддержка 10-й версии стандарта Unicode[56].
- Поддержка протокола TLS 1.3[57].
- Экспериментальный масштабируемый сборщик мусора ZGC с низкими задержками. По умолчанию отключён, работает только на Linux/x64[58].
Java SE 12
[править | править код]Дата релиза — 13 марта 2019 года.
Изменения
[править | править код]- блок
switch
может использоваться в выражениях присваивания значения переменной; - добавлена поддержка 11-й версии стандарта Unicode;
- сборщик мусора ZGC: добавлена поддержка выгрузки классов;
- сборщик мусора G1: добавлена экспериментальная возможность размещения старого поколения кучи на альтернативных модулях памяти, например, NVDIMM[англ.];
- в классе NumberFormat добавлена поддержка компактного вывода больших чисел, например: 1K=1000, 1M=1 000 000;
- устранены некоторые неиспользумые (или признанные устаревшими (deprecated) классы и/или их методы, например, класс SecurityWarning из пакета AWT, методы finalize в классах FileInputStream и FileOutputStream[59].
Java SE 13
[править | править код]Дата релиза — 17 сентября 2019 года[60].
Изменения
[править | править код]- в блоках
switch
добавлена возможность использования ключевого словаyield
, возвращающего указанное за ним значение; - для компактной записи строковых констант введена экспериментальная возможность работы с текстовыми блоками, обрамлённых тройками двойных кавычек (""");
- в классе FileSystems пакета java.nio.file добавлены новые реализации метода newFileSystem;
- методы get/put класса ByteBuffer пакета java.nio пересылают данные вне зависимости от текущей позиции в буфере передачи;
- добавлена поддержка Unicode 12.1;
- сборщик мусора ZGC возвращает более неиспользуемую память кучи ОС, при этом максимальный поддерживаемый размер памяти кучи увеличен до 16 ТБ;
- в JCA добавлена возможность чтения приватных ключей в формате CryptoAPI: Next Generation (англ. Microsoft CryptoAPI);
- для macOS исключена поддержка стиля оформления (look-and-feel) Swing Motif[61].
Java SE 14
[править | править код]Дата релиза — 17 марта 2020 года[60].
Изменения
[править | править код]- экспериментально введено ключевое слово
record
— для обозначения неизменяемых (final
) классов, являющихся контейнерами неизменяемых данных (записей); - введено сопоставление шаблонов для оператора
instanceof
в блокахswitch
; - в метках
case
блоковswitch
могут использоваться «стрелочные» (->) операторы; - исключён сборщик мусора Concurrent Mark and Sweep (CMS);
- методы suspend и resume классов Thread и ThreadGroup признаны устаревшими (deprecated)[62].
Java SE 15
[править | править код]Дата релиза — 15 сентября 2020 года[60].
Изменения
[править | править код]- добавлена экспериментальная возможность использования запечатанных (
sealed
) классов/интерфейсов, при объявлении которых с помощью нового ключевого словаpermits
можно указывать, какие классы/интерфейсы могут наследовать данный запечатанный класс/интерфейс; - добавлена возможность использования скрытых (
hidden
) классов, которые не могут использоваться непосредственно байт-кодом Java или другими классами; - в синтаксис языка официально введена экспериментально добавленная в Java 13 возможность работы с текстовыми блоками;
- добавлена поддержка Unicode 13.0;
- в классе CharSequence добавлен
default
-метод isEmpty; - в классе TreeMap добавлена возможность перегрузки методов putIfAbsent, computeIfAbsent, computeIfPresent, compute, merge[63].
Java SE 16
[править | править код]Дата релиза — 16 марта 2021 года[60].
Изменения
[править | править код]- в синтаксис языка официально введены экспериментально добавленные в Java 14 возможности работы с записями (
record
) и использованияinstanceof
в блокахswitch
; - добавлен Foreign Linker API, предназначенный для замены механизма JNI;
- добавлен Foreign-Memory Access API, позволяющий Java-приложениям эффективно и безопасно использовать память вне кучи Java;
- добавлено динамическое освобождение Metaspace — области памяти, в которой хранится статическая информация Java-приложения (метаданные загруженных классов), и возвращение освобождённой памяти ОС;
- в JCA добавлена поддержка алгоритма SHA-3;
- в классах SocketChannel и ServerSocketChannel пакета java.nio.channels добавлена поддержка использования сокетов домена Unix;
- добавлено свойство jdk.tls.maxHandshakeMessageSize, позволяющее задать максимальный размер сообщения рукопожатия для протоколов TLS/DTLS;
- в интерфейс Stream добавлен метод toList, позволяющий преобразовывать поток в список;
- добавлен Vector API, предназначенный для использования возможностей векторного исчисления;
- методы stop, destroy, isDestroyed, setDaemon, isDaemon класса ThreadGroup признаны устаревшими (deprecated);
- сборщик мусора ZGC может производить одновременную обработку стеков разных потоков;
- сборщик мусора G1 может одновременно освобождать память, занимавшуюся разными потоками[64].
Java SE 17
[править | править код]Дата релиза — 14 сентября 2021 года[60].
Изменения
[править | править код]- в синтаксис языка официально введена экспериментально добавленная в Java 15 возможность работы с запечатанными (
sealed
) классами/интерфейсами; - экспериментально расширена возможность использования блоков
switch
— в них можно выполнять разные действия в зависимости от того, к какому классу относится указанный объект, то есть метки case могут быть именами классов; - в генераторах псевдослучайных чисел (пакет java.util) добавлены новые алгоритмы/методы генерации;
- добавлен Foreign Function & Memory API, позволяющий Java-приложениям взаимодействовать с кодом и данными вне среды выполнения Java;
- в классе Console пакета java.io добавлен метод charset, возвращающий используемый консолью набор символов;
- добавлено новое системное свойство native.encoding, позволяющее узнать обозначение (наименование) кодировки символов базовой среды хоста;
- в пакет java.time добавлен интерфейс InstantSource, позволяющий получать информацию о текущем моменте времени;
- в пакет java.util добавлен класс HexFormat, позволяющий преобразовывать числа шестнадцатеричной системы счисления в числа других систем счисления (или строки) и обратно;
- в MacOS
- добавлена возможность использования нового конвейера рендеринга 2D-графики Swing — Apple Metal;
- интерфейс UserDefinedFileAttributeView пакета java.nio.file.attribute расширен для возможнсти получения доступа к дополнительным атрибутам файлов;
- в классе FileSystemView пакета javax.swing.filechooser добавлен метод getSystemIcon, позволяющий загружать иконки высокого качества/разрешения;
- в классе DatagramSocket пакета java.net добавлены методы joinGroup и leaveGroup, предназначенные соответственно для присоединения к группе многоадресной рассылки или выхода из неё;
- исключён механизм активации RMI;
- в виртуальной машине Java HotSpot исключён код AOT-компилятора[65].
Java SE 18
[править | править код]Дата релиза — 22 марта 2022 года[60].
Изменения
[править | править код]- во всех Java SE API кодировка по умолчанию изменена на UTF-8;
- добавлена утилита простого веб-сервера jwebserver, запускаемая из командной строки;
- улучшена безопасность при использовании методов рефлексии;
- добавлен интерфейс поставщика услуг для имени хоста и разбора сетевого адреса;
- интерфейс JavaFileManager пакета javax.tools расширен 2 новыми методами — getJavaFileForOutputForOriginatingFiles и getFileForOutputForOriginatingFiles, которые используются для создания новых файлов на основании указанных исходных файлов; интерфейс Filer пакета javax.annotation.processing использует эти методы при создании новых файлов в той же манере;
- в класс Charset пакета java.nio.charset добавлена перегрузка метода forName, вторым аргументом которого может указываться наименование резервной кодировки, на случай отсутствия в системе (или невозможности определения) запрашиваемой первым аргументом;
- признаны устаревшими (deprecated)
- механизмы финализации (методы finalize) разных классов;
- метод stop класса Thread;
- в сборщике мусора G1 максимальный размер обрабатываемых регионов кучи увеличен с 32 до 512 Мб;
- в сборщиках мусора SerialGC, ParallelGC, ZGC добавлена поддержка дедупликации[66].
Java SE 19
[править | править код]Дата релиза — 20 сентября 2022 года[60].
Изменения
[править | править код]- добавлены экспериментальные возможности
- работы с виртуальными потоками;
- проверки, является ли передаваемый методу объект записью (
record
);
- добавлена поддержка Unicode 14.0;
- в потоках вывода System.out и System.err добавлены новые свойства — stdout.encoding и stderr.encoding соответственно, которые определяют кодировку символов потока;
- добавлена поддержка токенов привязки каналов TLS при аутентификации по протоколам Kerberos/Negotiate через HTTPS;
- в классах DateTimeFormatter и DateTimeFormatterBuilder пакета java.time.format добавлены новые возможности определения форматов времени и дат;
- в классах HashMap, LinkedHashMap, WeakHashMap, HashSet, LinkedHashSet добавлены статические методы, позволяющие создавать новые хэш-таблицы;
- в классе SSLParameters пакета javax.net.ssl добавлены методы getSignatureSchemes и setSignatureSchemes, позволяющие соответственно получать и задавать схемы проверки электронных цифровых подписей при соединениях по протоколам TLS/DTLS;
- изменено действие методов класса ThreadGroup:
- методы destroy и setDaemon не делают ничего;
- метод isDestroyed всегда возвращает false;
- методы suspend, resume и stop всегда выбрасывают исключение UnsupportedOperationException;
- конструкторы класса Locale пакета java.util признаны устаревшими (deprecated) — вместо них рекомендуется использовать статический метод of[67].
Java SE 20
[править | править код]Дата релиза — 21 марта 2023 года[60].
Изменения
[править | править код]- при работах с потоками введена экспериментальная возможность использования ограниченных значений (параметризованный класс ScopedValue), которые могут эффективно и безопасно использоваться разными потоками;
- добавлена поддержка Unicode 15.0;
- в классе SSLParameters пакета javax.net.ssl добавлены методы getNamedGroups и setNamedGroups, позволяющие в приоритетном порядке настраивать списки групп алгоритмов обмена ключами при соединениях по протоколам TLS/DTLS;
- изменено действие методов suspend, resume и stop класса Thread — они всегда выбрасывают исключение UnsupportedOperationException;
- признаны устаревшими (deprecated)
- конструкторы класса URL пакета java.net — вместо них рекомендуется использовать новый статический метод of этого класса или методы toURL класса URI из того же пакета;
- используемые в Java-апплетах классы MLet, MLetContent, PrivateMLet, MLetMBean пакета javax.management.loading;
- в сборщике мусора G1 улучшена параллельная обработка потоков[68].
Java SE 21
[править | править код]Дата релиза — 19 сентября 2023 года[60].
Изменения
[править | править код]- в синтаксис языка официально введены ранее экспериментально добавленные возможности
- расширения использования блоков
switch
— в них можно выполнять разные действия в зависимости от того, к какому классу относится указанный объект, то есть метки case могут быть именами классов (с Java 17); - проверки, является ли передаваемый методу объект записью (
record
) (с Java 19); - работы с виртуальными потоками (с Java 19);
- расширения использования блоков
- добавлены параметризованные интерфейсы SequencedCollection, SequencedSet, SequencedMap для работы с коллекциями, в которых чётко определён порядок следования элементов;
- добавлен Key Encapsulation Mechanism API — механизм обеспечения надёжной работы с симметричными криптосистемами;
- добавлены экспериментальные возможности работы
- со строковыми шаблонами, в которых могут использоваться текстовые блоки;
- безымянными шаблонами и переменными, обозначемыми символом «_»;
- с безымянными классами — внутри java-файла можно без определения имени класса записать определение метода main;
- класс HttpClient пакета java.net.http теперь реализует интерфейс AutoCloseable;
- в классы Pattern пакета java.util.regex и String добавлены методы splitWithDelimiters, возвращающие строковые массивы, состоящие как из обычных символов, так и символов-разделителей;
- в классах StringBuilder и StringBuffer добавлены методы repeat, возвращающие повторённые указанное число раз последовательности символов;
- в классе Character добавлены новые методы работы с символами эмодзи;
- в классе ThreadGroup удалён метод allowThreadSuspension;
- удалён класс Compiler;
- в сборщике мусора ZGC добавлена раздельная обработка объектов молодого и старого поколений[69].
Классификация платформ Java
[править | править код]Внутри Java существует несколько основных семейств технологий:
- Java SE — Java Standard Edition — основное издание Java. Содержит компиляторы, API, Java Runtime Environment; подходит для создания пользовательских приложений, в первую очередь — для настольных систем.
- Jakarta EE (ранее — Java EE (Enterprise Edition)) представляет собой набор спецификаций для создания ПО уровня предприятия. В 2017-м проект Java EE был передан Eclipse Foundation, и тогда же его наименование изменилось на текущее[70][71]. Модули Java EE удалены из Java SE с 11-й версии[72].
- Java ME — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например, в мобильных телефонах, КПК, встроенных системах;
- Java Card — технология предоставляет безопасную среду для приложений, работающих на смарт-картах и других устройствах с очень ограниченным объёмом памяти и возможностями обработки.
Java и Microsoft
[править | править код]Компанией Microsoft была разработана собственная реализация JVM под названием Microsoft Java Virtual Machine[англ.] (MSJVM)[73], включавшаяся в состав различных операционных систем, начиная с Windows 98 (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJVM в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).
MSJVM имела существенные отличия от Sun Java, во многом ломающие основополагающую концепцию переносимости программ между разными платформами:
- отсутствие поддержки программного интерфейса вызова удалённых методов (RMI);
- отсутствие поддержки технологии JNI;
- наличие нестандартных расширений, таких, как средства интеграции Java и DCOM, работающих только на платформе Windows.
Тесная интеграция Java с DCOM и Win32 поставила под вопрос кроссплатформенную парадигму языка. Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года[73].
В 2005 году компанией Microsoft для платформы .NET был представлен Java-подобный язык J#, не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика Microsoft Visual Studio, начиная с Visual Studio 2008[74].
Java и Android
[править | править код]Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код для использования их виртуальной машиной Dalvik (начиная с Android 5.0 Lollipop виртуальная машина заменена на ART). Для такой компиляции используется дополнительный инструмент, а именно Android SDK (Software Development Kit), разработанный компанией Google.
Разработку приложений можно вести в среде Android Studio, NetBeans, в среде Eclipse.
Применения платформы Java
[править | править код]Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: RuneScape, Amazon[75][76], eBay[77][78], LinkedIn[79], Yahoo![80].
Следующие компании в основном фокусируются на Java- (J2EE-) технологиях: SAP, IBM, Oracle. В частности, СУБД Oracle Database включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры[81].
Производительность
[править | править код]Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке C[8]. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 годах JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие, как внутренние классы, класс StringBuffer
[док. 5], упрощённые логические вычисления и так далее). Кроме того, была произведена оптимизация виртуальной машины Java — с 2000 года для этого используется виртуальная машина HotSpot. По состоянию на февраль 2012 года код Java 7 приблизительно в 1,8 раза медленнее кода, написанного на языке Си[82].
Некоторые платформы предлагают аппаратную поддержку выполнения для Java[83]. К примеру, микроконтроллеры, выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байт-кода Java через опцию Jazelle.
Основные возможности
[править | править код]- Автоматическое управление памятью;
- Расширенные возможности обработки исключительных ситуаций;
- Богатый набор средств фильтрации ввода-вывода;
- Набор стандартных коллекций: массив, список, стек и т.п;
- Наличие простых средств создания сетевых приложений (в том числе — с использованием протокола RMI);
- Наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
- Встроенные в язык средства создания многопоточных приложений, которые потом были портированы на многие языки, например, Python;
- Унифицированный доступ к базам данных:
- на уровне отдельных SQL-запросов — на основе JDBC, SQLJ;
- на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе Java Data Objects[англ.] и Java Persistence API;
- Поддержка обобщений (с версии 1.5);
- Поддержка лямбд, замыканий, возможностей функционального программирования (с Java 8).
Основные идеи
[править | править код]Примитивные типы
[править | править код]В языке Java только 8 примитивных (скалярных, простых) типов: boolean
, byte
, char
, short
, int
, long
, float
, double
. Существует также вспомогательный девятый примитивный тип — void
, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использования при рефлексии: например, с помощью класса Void
[док. 6] можно узнать, является ли определённый метод типа void
: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE
.
Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией, и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причём в Java, в отличие от других языков, он не является беззнаковым. Типы float
и double
могут иметь специальные значения , и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY
, Double.NEGATIVE_INFINITY
, Double.NaN
; для типа float
— так же, но с приставкой Float
вместо Double
. Минимальные и максимальные значения, принимаемые типами float
и double
, тоже стандартизованы.
Тип | Длина (в байтах) | Диапазон или набор значений |
---|---|---|
boolean | 1 в массивах, 4 в переменных[84] | true, false |
byte | 1 | −128..127 |
char | 2 | 0..216−1, или 0..65535 |
short | 2 | −215..215−1, или −32768..32767 |
int | 4 | −231..231−1, или −2147483648..2147483647 |
long | 8 | −263..263−1, или примерно −9.2·1018..9.2·1018 |
float | 4 | -(2-2−23)·2127..(2-2−23)·2127, или примерно −3.4·1038..3.4·1038, а также , , NaN |
double | 8 | -(2-2−52)·21023..(2-2−52)·21023, или примерно −1.8·10308..1.8·10308, а также , , NaN |
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее, одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp
, запрещающее повышение точности. Начиная с Java 17, запрет на повышение точности снова начал действовать, а ключевое слово strictfp
было объявлено устаревшим[85].
Преобразования при математических операциях
[править | править код]В языке Java действуют следующие правила:
- Если один операнд имеет тип
double
, другой тоже преобразуется к типуdouble
. - Иначе, если один операнд имеет тип
float
, другой тоже преобразуется к типуfloat
. - Иначе, если один операнд имеет тип
long
, другой тоже преобразуется к типуlong
. - Иначе оба операнда преобразуются к типу
int
.
Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в Си/C++[86].
Объектные переменные, объекты, ссылки и указатели
[править | править код]В языке Java имеются только динамически создаваемые объекты. Переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть аналогами указателей на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, код на C++ может выглядеть следующим образом:
double a[10][20];
Foo b(30);
Но то же самое на Java будет выглядеть совсем по-другому:
double[][] a = new double[10][20];
Foo b = new Foo(30);
При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций разыменовывания — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование.
- Нельзя преобразовывать объект типа
int
или любого другого примитивного типа в указатель или ссылку и наоборот. - Над ссылками запрещено выполнять операции
++
,−−
,+
,−
или любые другие арифметические и логические операции (&&
,||
,^^
). - Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано, а во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности.
- В Java нет операций взятия адреса (
&
) или взятия объекта по адресу (*
). Амперсанд (&
) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»). Однако для булевых типов одиночный амперсанд означает «логическое и», отличающееся от двойного тем, что цепь проверок не прекращается при получении в выражении значенияfalse
[87]. Например,a == b && foo() == bar()
не повлечёт вызововfoo()
иbar()
в случае, еслиa != b
, тогда как использование&
— повлечёт в любом случае.
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: null
).
Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов: Boolean
, Byte
, Character
, Short
, Integer
, Long
, Float
, Double
.
Дублирование ссылок и клонирование
[править | править код]При присваивании не происходит копирования объекта, так как объектные переменные — ссылочные. Так, если написать
Foo foo, bar;
. . .
bar = foo;
то произойдёт копирование адреса из переменной foo
в переменную bar
. То есть foo
и bar
будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo
, будет менять объект, с которым связана переменная bar
, и наоборот. Если же необходимо получить именно ещё одну копию исходного объекта, пользуются или методом (функцией-членом, в терминологии C++) clone()
, создающим копию объекта, или (реже) копирующим конструктором (конструкторы в Java не могут быть виртуальными, поэтому экземпляр класса-потомка будет неправильно скопирован конструктором класса-предка; метод клонирования вызывает нужный конструктор и тем самым позволяет обойти это ограничение).
Метод clone()
[док. 7] требует, чтобы класс реализовывал интерфейс Cloneable
[док. 8]. Если класс реализует интерфейс Cloneable
, по умолчанию clone()
копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone()
. Определение и использование метода clone()
часто является нетривиальной задачей[88].
Инициализация переменных
[править | править код]Все переменные или требуют явного определения, или автоматически заполняются нулями (0, null
, false
). Таким образом, исчезают гейзенбаги, связанные со случайным использованием неинициализированной памяти, характерные для низкоуровневых языков вроде Си.
Сборка мусора
[править | править код]В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на необходимость освобождения памяти, является присваивание переменной пустого значения null
, что может оказаться эффективным при необходимости освободить более не требующийся объект, ссылка на который хранится в долгоживущем объекте[89]. Это, однако, не значит, что объект, заменённый значением null
, будет непременно и немедленно удалён, но есть гарантия, что этот объект будет удалён именно в будущем. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удалён сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.
Классы и функции
[править | править код]Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» (англ. member function), а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin()
, а есть метод Math.sin()
класса Math
(содержащего, кроме sin()
, методы cos()
, exp()
, sqrt()
, abs()
и многие другие).
Как и в языке C, любая исполняемая программа на Java должна иметь точку входа, которой является функция с именем main — она должна быть единственной в программе и, в отличие от Си, всегда статической. При этом, начиная с Java 21, в которой были введены безымянные классы, допускается определять метод main (точку входа), не определяя имени главного класса.
Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод finalize()
ни в коем случае нельзя считать аналогом деструктора.
Конструкторы
[править | править код]Конструктор — это специальный метод, который обязательно вызывается при создании нового объекта, то есть объект (экземпляр класса) не может быть создан без вызова конструктора класса. Не всегда удобно инициализировать все переменные класса при создании его экземпляра, поэтому переменные экземпляра часто объявляют внутри тела конструктора, а инициализируют как аргументы конструктора при создании экземпляра класса. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта. В таком случае переменные объявляются и инициализируются внутри тела конструктора.
Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.
private int Cat(); // так выглядит метод по имени Cat
Cat(); // так выглядит конструктор класса Cat
В отличие от метода, конструктор никогда ничего не возвращает.
Конструктор определяет действия, выполняемые при создании объекта класса, и является важной частью класса. Как правило, программисты стараются явно указать конструктор. Если явного конструктора нет, то Java автоматически создаст его (пустым) для использования по умолчанию.
В качестве примера можно рассмотреть некий класс Box
, представляющий собой описание коробки. Конструктор класса просто установит начальные размеры для коробки.
class Box {
int width; // ширина коробки
int height; // высота коробки
int depth; // глубина коробки
// Конструктор
Box(int a, int b) {
width = a;
height = b;
depth = 10;
}
// вычисляем объём коробки
int getVolume() {
return width * height * depth;
}
}
Статические методы и поля
[править | править код]В Java (как и в C++) используются статические поля и статические методы (англ. static method — в теории программирования их также называют методами класса), которые задаются при помощи ключевого слова static
. Статические поля (переменные класса) имеют тот же смысл, что и в C++: каждое такое поле является собственностью класса, поэтому для доступа к статическим полям не требуется создавать экземпляры соответствующего класса.
Например, математические функции, реализованные в классе Math
[док. 9], представляют собой как раз статические методы данного класса. Поэтому их можно вызывать напрямую из класса, не создавая его экземпляра, например:
double x = Math.sin(1);
Создание экземпляра статического класса запрещают с помощью приватного конструктора. Например, создание экземпляра класса Math
приведёт к ошибке на этапе компиляции:
Math m = new Math(); // Error: Math() has private access in java.lang.Math
double x = m.sin(1); // Метода sin у объекта не существовало бы, т. к. он статичный
Поскольку статические методы существуют независимо от объектов (экземпляров класса), они не имеют доступа к обычным (не статическим) полям и методам данного класса. В частности, при реализации статического метода недопустимо использовать идентификатор this
.
Возможность статического импорта позволяет вызывать статические функции и константы без указания класса. Пример без статического импорта:
double x = Math.sin(Math.tan(Math.sqrt(y)) + Math.floor(24.5)) + Math.cos(42 * Math.PI);
Тот же пример, но со статическим импортом:
import static java.lang.Math.*;
...
double x = sin(tan(sqrt(y)) + floor(24.5)) + cos(42 * PI);
Завершённость (final)
[править | править код]Ключевое слово final
(финальный) имеет разные значения при описании поля, метода или класса.
- Финальное поле класса инициализируется при описании или в конструкторе класса (а статическое поле — в статическом блоке инициализации). Впоследствии его значение не может быть изменено. Если статическое поле класса или переменная проинициализированы константным выражением, они рассматриваются компилятором как именованная константа; в таком случае их значение может быть использовано в операторах
switch
(для констант типовint
иString
, в том числе — элементов перечислений), а также для условной компиляции (для констант типаboolean
) при использовании с операторомif
. - Значения локальных переменных, а также параметров метода, помеченных ключевым словом
final
, не могут быть изменены после присвоения. При этом их значения могут использоваться внутри анонимных классов. - Метод класса, отмеченный словом
final
, не может быть переопределён при наследовании. - Финальный класс не может иметь наследников.
Абстрактность
[править | править код]В Java методы, не объявленные явно как static
, final
или private
, являются виртуальными в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.
Абстрактным методом (модификатор abstract
) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не задано тело. Абстрактный метод определяется в классах-наследниках. Аналог абстрактного метода в C++ — чисто виртуальная функция (pure virtual function). Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя.
Интерфейсы
[править | править код]Высшей степенью абстрактности в Java является интерфейс (модификатор interface
). Интерфейс содержит преимущественно абстрактные методы, имеющие всеобщий уровень доступа: описатели abstract
и public
для них даже не требуются. Однако с версий Java 8 и 9 были введены возможности использования в интерфейсах
— Java 8: статических (static
) методов и методов по умолчанию (default
);
— Java 9: методов, имеющих уровень доступа private
.
Эти методы содержат тело, а значит абстрактными не являются, но в конкретной реализации интерфейса default
-методы могут быть переопределены.
Интерфейс в Java не считается классом, хотя, по сути, является полностью абстрактным классом.
Класс может наследовать/расширять (extends
) другой класс или реализовывать (implements
) интерфейс. Интерфейсы же могут наследовать/расширять другие интерфейсы. В Java класс не может наследовать более одного класса, зато может реализовывать несколько интерфейсов. Множественное наследование интерфейсов не запрещено — один интерфейс может наследоваться от нескольких.
С версии Java 15 (экспериментально, официально — с версии Java 17) добавлена возможность использования запечатанных (sealed
) классов/интерфейсов, при объявлении которых, с помощью ключевого слова permits
, можно указывать, какие классы/интерфейсы могут наследовать данный запечатанный класс/интерфейс.
Интерфейсы можно использовать в качестве типов параметров методов. Нельзя создавать экземпляры интерфейсов.
Маркерные интерфейсы
[править | править код]В Java есть интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM: Cloneable
, Serializable
, RandomAccess
, Remote
.
Шаблоны в Java (generics)
[править | править код]Начиная с версии Java 5.0 в языке появился механизм обобщённого программирования — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.
// Объявление обобщённого класса
class GenericClass<E> {
E getFirst() { ... }
void add(E obj) { ... }
}
// Использование обобщённого класса в коде
GenericClass<String> obj = new GenericClass<>();
obj.add("qwerty");
String p = obj.getFirst();
Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <T extends A & B & C...>
требует, чтобы тип-параметр T реализовывал интерфейсы A, B, C и так далее.
В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.
Проверка принадлежности к классу
[править | править код]В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo
равно true
, если объект foo
принадлежит классу Foo
или его наследнику, или реализует интерфейс Foo
(или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo
).
Далее функция getClass()
[док. 10], определённая для всех объектов, выдаёт объект типа Class<?>
. Для каждого класса создаётся не более одного описывающего его объекта типа Class
, поэтому эти объекты можно сравнивать. Так, например, foo.getClass() == bar.getClass()
будет истинно, если объекты foo
и bar
принадлежат к одному классу.
Кроме того, объект типа Class<?>
любого типа можно получить так: Integer.class
, Object.class
.
Прямое сравнение классов не всегда является оптимальным средством проверки на принадлежность к классу. Зачастую вместо него используют функцию isAssignableFrom()
. Эта функция определена у объекта типа Class
и принимает объект типа Class<?>
в качестве параметра. Таким образом, вызов Foo.class.isAssignableFrom(Bar.class)
вернёт true
в случае, если Foo
является предком класса Bar
. Так как все объекты являются потомками типа Object
, вызов Object.class.isAssignableFrom()
всегда вернёт true
.
В паре с упомянутыми функциями объекта типа Class
используются также функции isInstance
[док. 11] (эквивалентно instanceof
), а также cast()
(преобразует параметр в объект выбранного класса).
Обработка ошибок
[править | править код]Обработка ошибок в Java похожа на обработку ошибок в C++ за исключением необходимости в блоке finally
. Данное отличие обусловлено тем, что Java не может придерживаться концепции RAII из-за наличия сборщика мусора, а автоматическое освобождение ресурсов в деструкторе может идти в непредсказуемом порядке через произвольные промежутки времени.
Осуществляется обработка ошибок с помощью операторов try
, catch
и finally
. Выбрасываемая ошибка описывается объектом определённого класса, наследующегося от Throwable
[док. 12] и соответствующего типу ошибки. Внутрь блока try
помещается код, который может выбросить исключение, а блок catch
отлавливает заданные программистом типы ошибок. При этом можно указывать более одного блока catch
для обработки различных классов ошибок, или multi-catch для обработки нескольких ошибок. Блок finally
является необязательным, но при наличии выполняется независимо от возникновения ошибки и предназначен для освобождения выделенных в ходе работы блока try
ресурсов.
Начиная с Java 7 поддерживается интерфейс AutoCloseable
[док. 13], который позволяет реализовывать классы, автоматически освобождающие ресурсы. Объекты подобных классов требуется создавать в круглых скобках перед блоком try
. Простым примером автоматического освобождения ресурсом может служить чтение содержимого файла:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
if (args.length < 2) {
System.err.println("Не указано имя файла.");
return;
}
String filename = args[1];
// Открытый файл будет автоматически закрыт по ошибке
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
for (int n = 1; (line = reader.readLine()) != null; ++n) {
System.out.println(n + ": " + line);
}
} catch (FileNotFoundException e) {
System.err.println("Указанный файл не найден.");
}
// finally {
// reader.close(); // автоматическое закрытие ресурса
// }
}
}
Java придерживается концепции обязательного указания классов ошибок, которые может выбросить метод. Делается это с помощью ключевого слова throws
после описания метода. Если в методе не указать класс исключения (или его предка), которое может быть выброшено из метода, то это вызовет ошибку компиляции. Концепция должна была позволить делать код самодокументируемым, обозначая, какие исключения может выбросить тот или иной метод, но на практике редко себя оправдывает, поскольку в силу разных обстоятельств программист может указать в качестве выбрасываемого исключения класс Exception
либо заключить проблемные части метода в блок try
…catch
для игнорирования отдельных ошибок, либо — в блок try
…finally
, скрывая все возможные ошибки. Недостатком концепции также является и то, что программист сам должен определять и прописывать исключения, которые может выбрасывать метод[90].
Пространство имён
[править | править код]Идея пространств имён воплощена в Java-пакетах.
Название Java-пакета создаётся латиницей (используется нижний и верхний регистр) с цифрами (они не должны быть первыми в строке) и знаком подчёркивания (он не должен быть первым и последним в строке), не являющейся инструкциями языка (например, if
, null
), разделённой точками.
Правильные примеры названий:
project.types.net.media
a0.a_b.canrepeat.canrepeat.UPPERCASE.RaNdOmCaSe
(хотя нежелательно, из-за нечитабельности)
Неправильные примеры названий:
doubledots..something
(две точки подряд)нестандартный.язык
(не латиница)0first.characret.is.number
(число в начале)contains.white space
(пробел вместо точки)true.asd
(содержитtrue
, см. выше)
Пакеты содержат классы, интерфейсы, перечисления, аннотации (и т. д.), имена которых тоже создаются латиницей (используется нижний и верхний регистр) с цифрами (они не должны стоять первыми в строке). Публичный класс, интерфейс (и т. д.) в одном файле может быть только один. Имя публичного класса, интерфейса (и т. д.) в файле должно совпадать с названием файла. Каждый класс имеет своё пространство имён для функций, переменных и подклассов, подинтерфейсов (и т. д.), причём получить подкласс класса можно с помощью OuterClass.InnerClass
, а можно — с помощью OuterClass$InnerClass
, поэтому использование символа доллара в названии класса не рекомендуется.
Примеры программ
[править | править код]Код программы «Hello, world!».
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
import java.util.List;
import java.util.ArrayList;
public class Sample {
public static void main(String[] args) {
// Создание объекта по шаблону.
List<String> strings = new ArrayList<>();
strings.add("Hello");
strings.add("world");
strings.add("!");
for (var string : strings) {
System.out.print(string + " ");
}
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class TestClass {
private int value;
public int getValue() { return value; }
public void setValue(int valueIn) { this.value = valueIn; }
}
public class Main {
public static void main(String[] args) {
var testClass = new TestClass();
for (var field: testClass.getClass().getDeclaredFields()) {
System.out.printf("name:%s, type:%s \n", field.getName(), field.getType().getCanonicalName());
}
for (var method : testClass.getClass().getDeclaredMethods()) {
System.out.printf("name:%s, return type:%s \n", method.getName(), method.getReturnType().getCanonicalName());
}
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
public boolean value() default false;
}
@MyAnnotation(value=true)
public class TestClass {
}
public class Main {
public static void main(String[] args) {
var testClass = new TestClass();
var myAnnotation = testClass.getClass().getAnnotation(MyAnnotation.class);
if (myAnnotation != null) {
System.out.printf("value:%s \n", myAnnotation.value());
}
}
}
Средства разработки ПО
[править | править код]- JDK — помимо набора библиотек для платформ Java SE и Java EE, содержит компилятор командной строки javac и набор утилит, так же работающих в режиме командной строки.
- NetBeans IDE — свободная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Oracle, владельцем технологии Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, PHP, Fortran и др.).
- Eclipse IDE — свободная интегрированная среда разработки для Java SE, Java EE и Java ME[91]. Пропагандируется IBM, одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.).
- IntelliJ IDEA — среда разработки для платформ Java SE, Java EE и Java ME. Разработчик — компания JetBrains. Распространяется в двух версиях: свободной бесплатной (Community Edition) и коммерческой проприетарной (Ultimate Edition).
- JDeveloper — среда разработки для платформ Java SE, Java EE и Java ME. Разработчик — компания Oracle.
- BlueJ — среда разработки программного обеспечения на языке Java, созданная в основном для использования в обучении, но также подходящая для разработки небольших программ.
- Geany — свободная среда разработки программного обеспечения, написанная с использованием библиотеки GTK2.
См. также
[править | править код]Примечания
[править | править код]Комментарии
[править | править код]Документация
[править | править код]Источники
[править | править код]- ↑ 1 2 https://www.oracle.com/java/
- ↑ JDK 23 Release Notes . Дата обращения: 27 сентября 2024. Архивировано 27 сентября 2024 года.
- ↑ https://www.lemondeinformatique.fr/actualites/lire-java-open-source-c-est-fait-et-c-est-en-gpl-21350.html
- ↑ "Top Programming Languages 2020". IEEE Spectrum (англ.). Архивировано 18 января 2021. Дата обращения: 14 февраля 2021.
- ↑ TIOBE Index | TIOBE — The Software Quality Company . www.tiobe.com. Дата обращения: 19 ноября 2018. Архивировано 25 февраля 2018 года.
- ↑ Buyya. Object-oriented Programming with Java: Essentials and Applications. — Tata McGraw-Hill Education, 2009. — 678 с. — ISBN 9780070669086. Архивировано 12 ноября 2018 года.
- ↑ Star7: с чего начиналась Java . Дата обращения: 2 октября 2022. Архивировано 2 октября 2022 года.
- ↑ 1 2 Java 6 -server speed ÷ C++ GNU g++ speed | Computer Language Benchmarks Game . Дата обращения: 4 марта 2010. Архивировано из оригинала 14 июня 2011 года.
- ↑ Metz, Cade. Google pits C++ against Java, Scala, and Go (англ.). The Register (3 июня 2011). Дата обращения: 5 июня 2011. Архивировано 21 августа 2011 года.
- ↑ Loop Recognition in C++/Java/Go/Scala (0.3 МБ) Архивная копия от 16 ноября 2011 на Wayback Machine
- ↑ В Google провели сравнение производительности C++, Java, Go и Scala . Дата обращения: 5 июня 2011. Архивировано 8 июня 2011 года.
- ↑ Robert Tolksdorf. Programming languages for the Java Virtual Machine JVM (англ.). is-research GmbH. — Онлайн-каталог альтернативных языков и языковых расширений для JVM. Дата обращения: 5 июня 2009. Архивировано 21 августа 2011 года.
- ↑ Java 1.0 . Дата обращения: 16 декабря 2024. Архивировано 1 декабря 2024 года.
- ↑ SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED (10 февраля 2008). Дата обращения: 17 ноября 2018. Архивировано 10 февраля 2008 года.
- ↑ Java 2 Software (19 января 2004). Дата обращения: 17 ноября 2018. Архивировано 19 января 2004 года.
- ↑ Ada 83 LRM, Sec 12.1: Generic Declarations . archive.adaic.com. Дата обращения: 17 ноября 2018. Архивировано 17 апреля 2019 года.
- ↑ Collections Framework Enhancements . oracle.com. Дата обращения: 12 сентября 2023. Архивировано 25 ноября 2023 года.
- ↑ Результаты тестов . Дата обращения: 13 сентября 2012. Архивировано 25 июня 2012 года.
- ↑ JavaFX FAQ . www.oracle.com. Дата обращения: 17 ноября 2018. Архивировано 29 октября 2018 года.
- ↑ Smith, Donald. "The Future of JavaFX and Other Java Client Roadmap Updates". Архивировано 17 ноября 2018. Дата обращения: 17 ноября 2018.
- ↑ план разработки для JDK7 . Дата обращения: 4 июля 2011. Архивировано 8 января 2021 года.
- ↑ План Б . Дата обращения: 4 июля 2011. Архивировано 11 июля 2011 года.
- ↑ OpenJDK: Project Coin . openjdk.java.net. Дата обращения: 17 ноября 2018. Архивировано 4 октября 2012 года.
- ↑ Компания Oracle анонсировала выход Java Standard Edition 7 Архивная копия от 3 августа 2011 на Wayback Machine (рус.)
- ↑ Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7 Архивная копия от 9 августа 2021 на Wayback Machine (англ.)
- ↑ Акторное расширение языка Java в среде MPS Архивная копия от 29 апреля 2015 на Wayback Machine. — вестник ИТМО. — Вып 6 (94)
- ↑ What's New in JDK 8 . www.oracle.com. Дата обращения: 17 ноября 2018. Архивировано 13 апреля 2020 года.
- ↑ Method References (англ.). The Java™ Tutorials. docs.oracle.com. Дата обращения: 17 ноября 2018. Архивировано 21 октября 2018 года.
- ↑ JDK 9 release delayed another four months . Дата обращения: 17 мая 2017. Архивировано 9 мая 2017 года.
- ↑ Java 9 gets a release date: July 27 . Дата обращения: 17 мая 2017. Архивировано 17 мая 2017 года.
- ↑ Java 9 delayed to September 21 . Дата обращения: 29 июля 2017. Архивировано 29 июля 2017 года.
- ↑ Oracle Announces Java SE 9 and Java EE 8. Press Release (англ.). Oracle (21 сентября 2017). Дата обращения: 1 августа 2018. Архивировано 2 октября 2018 года.
- ↑ Project Jigsaw (англ.). openjdk.java.net. Дата обращения: 24 ноября 2018. Архивировано 9 января 2021 года.
- ↑ JEP 102: Process API Updates (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 6 сентября 2018 года.
- ↑ 1 2 JEP 110: HTTP/2 Client (Incubator) (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 2 сентября 2018 года.
- ↑ JEP 11: Incubator Modules (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 15 сентября 2018 года.
- ↑ JEP 254: Compact Strings (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 8 сентября 2018 года.
- ↑ JEP 287: SHA-3 Hash Algorithms (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 6 сентября 2018 года.
- ↑ JEP 277: Enhanced Deprecation (англ.). OpenJDK. Дата обращения: 6 сентября 2018. Архивировано 19 сентября 2018 года.
- ↑ Java Language Updates . www.oracle.com. Дата обращения: 14 ноября 2021. Архивировано 14 ноября 2021 года.
- ↑ JEP 283: Enable GTK 3 on Linux . openjdk.java.net. Дата обращения: 25 ноября 2018. Архивировано 24 ноября 2018 года.
- ↑ Oracle Java SE 10 Release Arrives (англ.). ORACLE. Дата обращения: 24 июня 2018. Архивировано 20 марта 2018 года.
- ↑ JEP 286: Local-Variable Type Inference (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JEP 304: Garbage Collector Interface (англ.). openjdk.java.net. Дата обращения: 20 ноября 2018. Архивировано 3 октября 2018 года.
- ↑ JEP 307: Parallel Full GC for G1 (англ.). openjdk.java.net. Дата обращения: 21 ноября 2018. Архивировано 3 октября 2018 года.
- ↑ Алексей Рагозин. Safepoints in HotSpot JVM (англ.). blog.ragozin.info. Дата обращения: 24 ноября 2018. Архивировано 24 ноября 2018 года.
- ↑ JEP 312: Thread-Local Handshakes (англ.). openjdk.java.net. Дата обращения: 24 ноября 2018. Архивировано 21 октября 2018 года.
- ↑ JEP 314: Additional Unicode Language-Tag Extensions (англ.). openjdk.java.net. Дата обращения: 22 ноября 2018. Архивировано 5 октября 2018 года.
- ↑ JEP 316: Heap Allocation on Alternative Memory Devices (англ.). openjdk.java.net. Дата обращения: 24 ноября 2018. Архивировано 22 октября 2018 года.
- ↑ JEP 317: Experimental Java-Based JIT Compiler (англ.). openjdk.java.net. Дата обращения: 22 ноября 2018. Архивировано 24 ноября 2018 года.
- ↑ JEP 322: Time-Based Release Versioning (англ.). openjdk.java.net. Дата обращения: 22 ноября 2018. Архивировано 31 октября 2018 года.
- ↑ JEP 181: Nest-Based Access Control (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JEP 318: Epsilon: A No-Op Garbage Collector (Experimental) (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JEP 321: HTTP Client (Standard) (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 24 ноября 2018 года.
- ↑ JEP 323: Local-Variable Syntax for Lambda Parameters (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 15 ноября 2018 года.
- ↑ JEP 327: Unicode 10 (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JEP 332: Transport Layer Security (TLS) 1.3 (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) (англ.). openjdk.java.net. Дата обращения: 18 ноября 2018. Архивировано 18 ноября 2018 года.
- ↑ JDK 12 Release Notes . Дата обращения: 24 сентября 2023. Архивировано 27 сентября 2023 года.
- ↑ 1 2 3 4 5 6 7 8 9 JDK Releases . Дата обращения: 16 января 2024. Архивировано 4 июня 2022 года.
- ↑ JDK 13 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ Consolidated JDK 14 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ JDK 15 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ JDK 16 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ Consolidated JDK 17 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ JDK 18 Release Notes . Дата обращения: 16 января 2024. Архивировано 18 апреля 2023 года.
- ↑ JDK 19 Release Notes . Дата обращения: 16 января 2024. Архивировано 20 сентября 2023 года.
- ↑ JDK 20 Release Notes . Дата обращения: 16 января 2024. Архивировано 12 сентября 2023 года.
- ↑ JDK 21 Release Notes . Дата обращения: 16 января 2024. Архивировано 16 января 2024 года.
- ↑ Delabassee, David. "Opening Up Java EE - An Update". Архивировано 26 ноября 2018. Дата обращения: 25 ноября 2018.
- ↑ "And the Name Is…". Life at Eclipse (англ.). 2018-02-26. Архивировано 26 ноября 2018. Дата обращения: 25 ноября 2018.
- ↑ JEP 320: Remove the Java EE and CORBA Modules . openjdk.java.net. Дата обращения: 25 ноября 2018. Архивировано 24 ноября 2018 года.
- ↑ 1 2 Microsoft Java Virtual Machine Support (англ.). Microsoft (12 сентября 2003). — Официальное заявление Microsoft о программе поддержки MSJVM. Дата обращения: 9 октября 2010. Архивировано 21 августа 2011 года.
- ↑ Visual J# . Microsoft (ноябрь 2007). — Официальная информация Microsoft об исключении J# из комплекта Visual Studio 2008. Дата обращения: 10 октября 2010. Архивировано 21 августа 2011 года.
- ↑ Todd Hoff. Amazon Architecture (англ.) (18 сентября 2007). — Обсуждение архитектуры Amazon с использованием Java-технологий. Дата обращения: 6 июня 2009. Архивировано 28 февраля 2009 года.
- ↑ Amazon Elastic Compute Cloud (Amazon EC2) (англ.). Amazon Web Services LLC. — Описание технологии и возможностей Amazon EC2 как веб-сервиса. Дата обращения: 6 июня 2009. Архивировано 21 августа 2011 года.
- ↑ Todd Hoff. eBay Architecture (англ.) (27 мая 2008). — Обсуждение архитектуры eBay на платформе Java. Дата обращения: 6 сентября 2009. Архивировано 21 августа 2011 года.
- ↑ Randy Shoup, Dan Pritchett. The eBay Architecture (англ.). SD Forum 2006. ??? (29 ноября 2006). — Презентация по истории развития архитектуры eBay. Дата обращения: 6 июня 2009. Архивировано 21 августа 2011 года.
- ↑ Brian Guan. The LinkedIn Blog. Blog Archive. Grails at LinkedIn (англ.). LinkedIn.com (11 июня 2008). — История создания системы LinkedIn на основе Java-технологии Grails. Дата обращения: 5 июня 2009. Архивировано 21 августа 2011 года.
- ↑ Hadoop and Distributed Computing at Yahoo! (англ.). Yahoo!. — Стартовая страница Java-технологии распределённого обслуживания Hadoop на портале разработчиков Yahoo! Дата обращения: 21 июня 2009. Архивировано 21 августа 2011 года.
- ↑ OracleJVM and Java Stored Procedures (англ.). Oracle Inc.. — Раздел портала Oracle, посвящённый технологиям Java в составе сервера СУБД Oracle. Дата обращения: 5 июня 2009. Архивировано 21 августа 2011 года.
- ↑ Ubuntu: Intel® Q6600® quad-core Computer Language Benchmarks . Архивировано 22 июня 2012 года.
- ↑ Wolfgang Puffitsch, Martin Schoeberl. picoJava-II in an FPGA (англ.) // DTU Library. — 2007. Архивировано 2 декабря 2018 года.
- ↑ JVM не имеет поддержки для переменных типа boolean, поэтому они представляются в виде значений типа int. Однако массивы boolean[] поддерживаются. VM Spec The Structure of the Java Virtual Machine Архивная копия от 24 ноября 2011 на Wayback Machine
- ↑ JEP 306: Restore Always-Strict Floating-Point Semantics (англ.). Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ Бьярн Страуструп. Язык программирования C++ = The C++ Programming Language. — М.—СПб.: Бином, Невский диалект, 2008. — 1104 с. — 5000 экз. — ISBN 5-7989-0226-2; ISBN 5-7940-0064-3; ISBN 0-201-70073-5.
- ↑ Джеймс Гослинг, Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли, Даниел Смит. Java Language Specification. Chapter 15. Expressions (англ.). docs.oracle.com. Дата обращения: 1 декабря 2018. Архивировано 1 декабря 2018 года.
- ↑ Java API Reference. Class Object (англ.). docs.oracle.com. Дата обращения: 26 ноября 2018. Архивировано 26 ноября 2018 года.
- ↑ Scott Oaks. Java Performance: The Definitive Guide: Getting the Most Out of Your Code. — "O'Reilly Media, Inc.", 2014-04-10. — 425 с. — ISBN 9781449363543. Архивировано 21 июля 2021 года.
- ↑ The Trouble with Checked Exceptions . www.artima.com. Дата обращения: 21 декабря 2018. Архивировано 8 января 2019 года.
- ↑ Pulsar - Eclipse Mobile Tools Platform (англ.). Eclipse. — Проект eclipse для мобильных разработчиков. Дата обращения: 23 марта 2011. Архивировано 21 августа 2011 года.
Литература
[править | править код]- Герберт Шилдт. Java. Полное руководство, 10-е издание = Java. The Complete Reference, 10th Edition. — М.: «Диалектика», 2018. — 1488 с. — ISBN 978-5-6040043-6-4.
- Кей С. Хорстманн. Java SE 9. Базовый курс = Core Java SE 9 for the Impatient. — М.: «Вильямс», 2018. — 576 с. — ISBN 978-5-6040043-0-2, 978-0-13-469472-6.
- Кей С. Хорстманн. Java SE 8. Вводный курс = Java SE 8 for the Really Impatient. — М.: «Вильямс», 2014. — 208 с. — ISBN 978-5-8459-1900-7.
- Фрэд Лонг, Дхрув Мохиндра, Роберт С. Сикорд, Дин Ф. Сазерленд, Дэвид Свобода. Руководство для программиста на Java: 75 рекомендаций по написанию надёжных и защищённых программ = Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs. — М.: «Вильямс», 2014. — 256 с. — ISBN 978-5-8459-1897-0.
- Кей С. Хорстманн. Java. Библиотека профессионала, том 1. Основы. 10-е издание = Core Java. Volume I - Fundamentals (Tenth Edition). — М.: «Вильямс», 2017. — 864 с. — ISBN 978-5-8459-2084-3.
- Кей С. Хорстманн. Java. Библиотека профессионала, том 2. Расширенные средства программирования. 10-е издание = Core Java. Volume II - Advanced Feature (Tenth Edition). — М.: «Вильямс», 2017. — 976 с. — ISBN 978-5-9909445-0-3.
- Барри Берд. Java 9 для чайников = Java For Dummies, 7th edition. — М.: «Диалектика», 2018. — 624 с. — ISBN 978-5-9500296-1-5, 978-1-119-23555-2.
- Кишори Шаран. Java 9. Полный обзор нововведений = Java 9 Revealed. — М.: «ДМК Пресс», 2018. — 544 с. — ISBN 978-5-97060-575-2.
- Джеймс Гослинг, Билл Джой, Гай Стил, Гилад Брача, Алекс Бакли. Язык программирования Java SE 8. Подробное описание, 5-е издание = The Java Language Specification, Java SE 8 Edition (5th Edition) (Java Series). — М.: «Вильямс», 2015. — 672 с. — ISBN 978-5-8459-1875-8.
- Джошуа Блох. Java. Эффективное программирование = Effective Java. — 3-е. — М.: Диалектика, 2019. — 464 с. — ISBN 978-5-6041394-4-8.
- Бенджамин Дж. Эванс, Джеймс Гоф, Крис Ньюленд. Java: оптимизация программ. Практические методы повышения производительности приложений в JVM. — М.: Диалектика, 2019. — 448 с. — ISBN 978-5-907114-84-5.
- Монахов Вадим. Язык программирования Java и среда NetBeans. — 3-е изд. — СПб.: БХВ-Петербург, 2011. — 704 с. — ISBN 978-5-9775-0671-7.
- Брюс Эккель. Философия Java = Thinking in Java. — 4-е изд. — СПб.: Питер, 2018. — 1168 с. — ISBN 978-5-496-01127-3.
Ссылки
[править | править код]- The Java Tutorials (англ.) — обучающие материалы по Java 8
- Bruce Eckel’s Free Electronic Books (англ.) — свободно распространяемые электронные версии книг Брюса Эккеля по C++ и Java вместе с исходным кодом
- Учебник Java 8
- Официальный сайт Java