Эта статья — о языке программирования. О прикладной платформе на основе данного языка см. Java (программная платформа).
Часто при знакомстве с Java сталкиваются с такими аббревиатурами, как JVM, JDK, JRE и OpenJDK. Это ключевые компоненты Java, каждый из которых имеет свою роль и функции.
Часто при знакомстве с Java сталкиваются с такими аббревиатурами, как JVM, JDK, JRE и OpenJDK. Это ключевые компоненты Java, каждый из которых имеет свою роль и функции. Разберем каждую из этих аббревиатур, чтобы лучше понять, что они представляют.
A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode. The JVM is detailed by a specification that formally describes what is required in a JVM implementation. Having a specification ensures interoperability of Java programs across different implementations so that program authors using the Java Development Kit (JDK) need not worry about idiosyncrasies of the underlying hardware platform.
Overview of a Java virtual machine (JVM) architecture based on The Java Virtual Machine Specification Java SE 7 Edition
The JVM reference implementation is developed by the OpenJDK project as open source code and includes a JIT compiler called HotSpot. The commercially supported Java releases available from Oracle are based on the OpenJDK runtime. Eclipse OpenJ9 is another open source JVM for OpenJDK.
- Основные особенности языка
- Архитектура виртуальной машины
- Безопасное выполнение удаленного кода
- Средства разработки ПО
- JVM (Java Virtual Machine)
- JRE (Java Runtime Environment)
- Разногласия между Sun и IBM
- JDK (Java Development Kit)
- Конкуренция между Sun и Microsoft
- OpenJDK
- Преобразования при математических операциях
- Объектные переменные, объекты, ссылки и указатели
- Дублирование ссылок и клонирование
- Классы и функции
- Статические методы и поля
- Шаблоны в Java (generics)
- Проверка принадлежности к классу
- Java и Microsoft
- Java SE 6
- Java ME Embedded
- Java SE 7
- Java SE 8
- Java SE 9
- Java SE 11
- Классификация платформ Java
- JVM in the web browser
- Применения платформы Java
Основные особенности языка
Программы на Java транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Дюк — талисман Java
Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 14 мая 2021 года; проверки требуют 11 правок.
Java Virtual Machine (сокращенно Java VM, JVM) — виртуальная машина Java — основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). J VM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может быть скомпилирован в байт-код Java, который затем может выполниться с помощью JVM.
Информация в этой статье или некоторых её разделах устарела.
Вы можете помочь проекту, обновив её и убрав после этого данный шаблон.
Обзор архитектуры JVM на базе версии Java SE 7
JVM является ключевым компонентом платформы Java. Так как виртуальные машины Java доступны для многих аппаратных и программных платформ, Java может рассматриваться и как связующее программное обеспечение, и как самостоятельная платформа. Использование одного байт-кода для многих платформ позволяет описать Java как «скомпилируй единожды, запускай везде» (compile once, run anywhere).
Виртуальные машины Java обычно содержат интерпретатор байт-кода, однако, для повышения производительности во многих машинах также применяется JIT-компиляция часто исполняемых фрагментов байт-кода в машинный код.
We intend that this specification should sufficiently document the Java Virtual Machine to make possible compatible clean-room implementations. Oracle provides tests that verify the proper operation of implementations of the Java Virtual Machine.
One of Oracle’s JVMs is named HotSpot; the other, inherited from BEA Systems, is JRockit. Oracle owns the Java trademark and may allow its use to certify implementation suites as fully compatible with Oracle’s specification.
One of the organizational units of JVM byte code is a class. Реализация загрузчика классов должна иметь возможность распознавать и загружать все, что соответствует формату файла классов Java. Любая реализация может распознавать и другие двоичные формы, помимо файлов классов, но она должна распознавать файлы классов.
Загрузчик классов выполняет три основных действия в следующем строгом порядке:
В общем, существует три типа загрузчика классов: загрузчик классов начальной загрузки, загрузчик классов расширения и загрузчик классов системы/приложения.
Каждая реализация виртуальной машины Java должна иметь загрузчик классов начальной загрузки, способный загружать доверенные классы, а также загрузчик классов расширения или загрузчик классов приложений. Спецификация виртуальной машины Java не определяет, как загрузчик классов должен находить классы.
Архитектура виртуальной машины
В JVM есть куча со сбором мусора для хранения объектов и массивов. Код, константы и другие данные класса хранятся в «области метода». Область метода логически является частью кучи, но реализации могут обрабатывать область метода отдельно от кучи и, например, не выполнять сборку мусора. Каждый поток JVM также имеет свой собственный стек вызовов (для ясности называемый «стеком виртуальной машины Java»), в котором хранятся кадры. Новый кадр создается каждый раз при вызове метода и уничтожается при выходе из этого метода.
Каждый кадр содержит «стек операндов» и массив «локальных переменных». Стек операндов используется для операндов для выполнения вычислений и для получения возвращаемого значения вызываемого метода, а локальные переменные служат той же цели, что и регистры, а также используются для передачи аргументов метода. Таким образом, JVM является одновременно стековой машиной и регистровой машиной. На практике HotSpot полностью исключает каждый стек, кроме собственного стека потоков/вызовов, даже при работе в интерпретируемом режиме, поскольку его интерпретатор шаблонов технически функционирует как компилятор.
Целью является бинарная совместимость. Каждая конкретная операционная система хоста нуждается в собственной реализации JVM и среде выполнения. Эти JVM интерпретируют байт-код семантически одинаково, но фактическая реализация может отличаться. Более сложной, чем просто эмуляция байт-кода, является совместимая и эффективная реализация основного API Java, который должен быть сопоставлен с каждой операционной системой хоста.
Эти инструкции работают с набором общих абстрактных типов данных, а не с собственными типами данных любой конкретной архитектуры набора команд.
JVM проверяет весь байт-код перед его выполнением. Эта проверка состоит в основном из трех типов проверок:
Первые две из этих проверок происходят в основном на этапе проверки, который происходит, когда класс загружается и становится пригодным для использования. Третий в основном выполняется динамически, когда к элементам данных или методам класса впервые обращается другой класс.
Безопасное выполнение удаленного кода
Для каждой аппаратной архитектуры необходим свой интерпретатор байт-кода Java. Если на компьютере есть интерпретатор байт-кода Java, он может запускать любую программу байт-кода Java, и одну и ту же программу можно запускать на любом компьютере, имеющем такой интерпретатор.
Когда байт-код Java выполняется интерпретатором, выполнение всегда будет медленнее, чем выполнение той же программы, скомпилированной на родном машинном языке. Эту проблему смягчают JIT-компиляторы для выполнения байт-кода Java. JIT-компилятор может транслировать байт-код Java на собственный машинный язык во время выполнения программы. Переведенные части программы могут выполняться гораздо быстрее, чем интерпретироваться. Этот метод применяется к часто выполняемым частям программы. Таким образом, JIT-компилятор может значительно ускорить общее время выполнения.
Между языком программирования Java и байт-кодом Java нет необходимой связи. Программа, написанная на Java, может быть скомпилирована непосредственно в машинный язык реального компьютера, а программы, написанные на других языках, кроме Java, могут быть скомпилированы в байт-код Java.
Средства разработки ПО
Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код для использования их конфигурации в машине Dalvik (начиная с Android 5.0 Lollipop виртуальная машина, замененная на ART). Для такой компиляции используется дополнительный инструмент, а именно Android SDK (Software Development Kit), разработанный компанией Google.
Разработку приложений можно вести в среде Android Studio, NetBeans, в среде Eclipse, с помощью этого плагина Android Development Tools (ADT) или в IntelliJ IDEA. Версия JDK при этом должна быть 5.0 или выше.
8 декабря 2014 года Android Studio признана компанией Google официальной средой разработки под ОС Android.
В 1996 году компания Sun выпустила первую версию документа «Голубая книга JVM», в котором описана спецификация виртуальной машины Java, ставшего де-факто отраслевым стандартом платформы Java. Благодаря этому документу появились альтернативные реализации JVM, являющиеся «разработками с чистого листа» (англ. clean room design). В качестве примера можно привести Kaffe.
Начиная с версии J2SE 5.0, изменения в спецификации JVM вырабатываются в соответствии с формализованными пожеланиями заинтересованных сторон. Процесс внесения изменений в спецификации JVM называется Java Community Process.
JVM, доступная в исходных текстах на Си от фирмы Sun, называется KVM (Kilo Virtual Machine) и доступна на их сайте.
Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. В 1994 году стало очевидным, что интерактивное телевидение было ошибкой.
С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же определённое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко.
В веб-разработке применяется Spring Framework; для документирования используется утилита Javadoc.
JVM (Java Virtual Machine)
JVM — это виртуальная машина Java. Она является основой для выполнения приложений на языке Java. J VM обеспечивает работу байт-кода Java, что позволяет Java быть платформо-независимым языком, так как JVM присутствует на всех основных операционных системах.
JRE (Java Runtime Environment)
JRE — это среда выполнения Java. Она предоставляет минимальные требования для выполнения приложения Java. J RE включает в себя JVM, библиотеки классов Java и другие модули, которые помогают JVM в выполнении программы.
Разногласия между Sun и IBM
В 2001 году с целью разработки стандарта кросс-платформенных настольных приложений IBM запустила открытый проект: «Eclipse».
Фреймворк «Eclipse» был основан на предыдущей закрытой разработке: IBM «VisualAge». I BM удалось сбалансировать интересы свободного сообщества и интересы бизнеса (свои интересы) в лицензии «Eclipse Public License», признанной организацией «Free Software Foundation».
Проект успешно развивается, используется в отрасли, в значительной степени отделился от IBM в самостоятельный (см. « Eclipse Foundation»).
Sun остаётся в оппозиции к Eclipse Foundation, так же, как и к Microsoft. Формально основной причиной противоречий остаётся библиотека «Standard Widget Toolkit» (SWT), которая противоречит Sun-концепции виртуальной машины и переносимости Java-приложений.
JDK (Java Development Kit)
JDK — это комплект для разработки на Java. Это основной инструмент для программиста на языке Java. J DK включает в себя JRE и набор разработчика, который включает в себя компилятор (javac), архиватор (jar) и документацию. J DK используется для разработки Java приложений и апплетов.
Программы, предназначенные для запуска на JVM, должны быть скомпилированы в стандартизированном переносимом двоичном формате, который обычно представляется в виде файлов «.class». Программа может состоять из множества классов, размещённых в различных файлах. Для облегчения размещения больших программ часть файлов вида «.class» может быть упакована вместе в так называемом «.jar»-файле (сокращение от «Java Archive»).
Виртуальная машина JVM исполняет файлы «.class» и «.jar», эмулируя данные в них инструкции следующими путями:
В наши дни JIT-компиляция используется в большинстве JVM для достижения большей скорости. Существуют также ahead-of-time компиляторы, позволяющие разработчикам приложений перекомпилировать файлы классов в родной для конкретной платформы код.
Как и большинство виртуальных машин, Java Virtual Machine имеет stack-ориентированную архитектуру, свойственную микроконтроллерам и микропроцессорам.
JVM — экземпляр JRE (Java Runtime Environment), вступающий в действие при исполнении программ Java; по завершении исполнения этот экземпляр удаляется сборщиком мусора. J IT — та часть виртуальной машины Java, которая используется для ускорения выполнения приложений; JIT одновременно компилирует те части байт-кода, функциональность которых аналогична, — что сокращает время, необходимое для проведения компиляции.
Конкуренция между Sun и Microsoft
В начале развития платформы «Java» существовали две конкурирующие реализации Java VM:
Однако «Microsoft Java VM» не была полностью совместима со спецификацией, описанной Sun в «голубой книге JVM», и имела существенные проблемы с производительностью при работе под большими нагрузками (при большом числе одновременно выполняемых потоков) и с безопасностью.
Компания «Sun» посчитала такую ситуацию недопустимой и решила, что Microsoft занимается намеренной дискредитацией и профанацией платформы «Java» путём распространения своей версии виртуальной машины Java, обладающей вышеперечисленными недостатками. На этом основании Sun неоднократно подавала в суд на Microsoft — и Microsoft была лишена следующих прав на реализацию:
Некоторые обозреватели компьютерных изданий полагают, что жёсткая позиция, занятая Sun по вопросу Java, могла послужить дополнительным стимулом для разработки компанией «Microsoft» собственного Windows-решения: «. NET Framework».
OpenJDK
OpenJDK — это свободная и открытая версия JDK. OpenJDK полностью совместим с JDK, но имеет открытый исходный код. Это позволяет сообществу вносить свой вклад в развитие и улучшение Java.
Таким образом, JVM, JDK, JRE и OpenJDK являются важными компонентами Java, каждый из которых играет свою роль в разработке и выполнении приложений на Java.
Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией, и приведены в таблице. Тип 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, тоже стандартизованы.
Преобразования при математических операциях
В языке Java действуют следующие правила:
Объектные переменные, объекты, ссылки и указатели
В языке Java имеются только динамически создаваемые объекты. Переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть аналогами указателей на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, код на C++ может выглядеть следующим образом:
Но то же самое на Java будет выглядеть совсем по-другому:
При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций разыменовывания — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование.
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: null).
Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов: Boolean, Byte, Character, Short, Integer, Long, Float, Double.
Дублирование ссылок и клонирование
При присваивании не происходит копирования объекта, так как объектные переменные — ссылочные. Так, если написать
то произойдёт копирование адреса из переменной foo в переменную bar. То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo, будет менять объект, с которым связана переменная bar, и наоборот. Если же необходимо получить именно ещё одну копию исходного объекта, пользуются или методом (функцией-членом, в терминологии C++) clone (), создающим копию объекта, или (реже) копирующим конструктором (конструкторы в Java не могут быть виртуальными, поэтому экземпляр класса-потомка будет неправильно скопирован конструктором класса-предка; метод клонирования вызывает нужный конструктор и тем самым позволяет обойти это ограничение).
Все переменные или требуют явного определения, или автоматически заполняются нулями (0, null, false). Таким образом, исчезают гейзенбаги, связанные со случайным использованием неинициализированной памяти, характерные для низкоуровневых языков вроде Си.
Классы и функции
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» (англ. ), а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin(), а есть метод Math.sin() класса Math (содержащего, кроме sin(), методы cos(), exp(), sqrt(), abs() и многие другие). Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод finalize() ни в коем случае нельзя считать аналогом деструктора.
Конструктор — это специальный метод, который обязательно вызывается при создании нового объекта, то есть объект (экземпляр класса) не может быть создан без вызова конструктора класса. Не всегда удобно инициализировать все переменные класса при создании его экземпляра, поэтому переменные экземпляра часто объявляют внутри тела конструктора, а инициализируют как аргументы конструктора при создании экземпляра класса. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта. В таком случае переменные объявляются и инициализируются внутри тела конструктора.
Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.
// так выглядит метод по имени Cat
// так выглядит конструктор класса Cat
В отличие от метода, конструктор никогда ничего не возвращает.
Конструктор определяет действия, выполняемые при создании объекта класса, и является важной частью класса. Как правило, программисты стараются явно указать конструктор. Если явного конструктора нет, то Java автоматически создаст его (пустым) для использования по умолчанию.
В качестве примера можно рассмотреть некий класс Box, представляющий собой описание коробки. Конструктор класса просто установит начальные размеры для коробки.
// ширина коробки
// высота коробки
// глубина коробки
// вычисляем объём коробки
Статические методы и поля
В Java (как и в C++) используются статические поля и статические методы (англ. — в теории программирования их также называют методами класса), которые задаются при помощи ключевого слова static. Статические поля (переменные класса) имеют тот же смысл, что и в C++: каждое такое поле является собственностью класса, поэтому для доступа к статическим полям не требуется создавать экземпляры соответствующего класса.
Создание экземпляра статического класса запрещают с помощью приватного конструктора. Например, создание экземпляра класса Math приведёт к ошибке на этапе компиляции:
// Error: Math() has private access in java.lang. Math
// Метода sin у объекта не существовало бы, т. к. он статичный
Поскольку статические методы существуют независимо от объектов (экземпляров класса), они не имеют доступа к обычным (не статическим) полям и методам данного класса. В частности, при реализации статического метода недопустимо использовать идентификатор this.
Возможность статического импорта позволяет вызывать статические функции и константы без указания класса. Пример без статического импорта:
Тот же пример, но со статическим импортом:
Ключевое слово 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) интерфейс. Кроме того, интерфейс может наследовать/расширять (extends) другой интерфейс.
В Java класс не может наследовать более одного класса, зато может реализовывать несколько интерфейсов. Множественное наследование интерфейсов не запрещено, то есть один интерфейс может наследоваться от нескольких.
Интерфейсы можно использовать в качестве типов параметров методов. Нельзя создавать экземпляры интерфейсов.
В Java есть интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM: Cloneable, Serializable, RandomAccess, Remote.
Шаблоны в Java (generics)
Начиная с версии Java 5.0 в языке появился механизм обобщённого программирования — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.
// Объявление обобщённого класса
// Использование обобщённого класса в коде
В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.
Проверка принадлежности к классу
В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo равно true, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).
Обработка ошибок в Java похожа на обработку ошибок в C++ за исключением необходимости в блоке finally. Данное отличие обусловлено тем, что Java не может придерживаться концепции RAII из-за наличия сборщика мусора, а автоматическое освобождение ресурсов в деструкторе может идти в непредсказуемом порядке через произвольные промежутки времени.
«Не указано имя файла.»
// Открытый файл будет автоматически закрыт по ошибке
«Указанный файл не найден.»
// reader.close(); // автоматическое закрытие ресурса
Идея пространств имён воплощена в Java-пакетах.
Название Java-пакета — латиница (нижний и верхний регистр) с цифрами (не первые в строке) и знаком подчёркивания (не первые и не последние), не являющаяся инструкциями языка (прим. if, null), разделённая точками.
Правильные примеры названий:
Неправильные примеры названий:
Пакеты содержат классы, интерфейсы, перечисления, аннотации (и т. д.), имена которых — латиница (нижний и верхний регистр) с цифрами (не первые в строке). Публичный класс, интерфейс (и т. д.) в одном файле может быть только один. Имя публичного класса, интерфейса (и т. д.) в файле должно совпадать с названием файла. Каждый класс имеет своё пространство имён для функций, переменных и подклассов, подинтерфейсов (и т. д.), причём получить подкласс класса можно с помощью OuterClass. InnerClass, а можно с помощью OuterClass$InnerClass, поэтому использование символа доллара в названии класса не рекомендуется.
Java и Microsoft
MSJVM имела существенные отличия от Sun Java, во многом ломающие основополагающую концепцию переносимости программ между разными платформами:
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только 21 января 1996 года.
В то время, когда Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если J2SE 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, что приводит к полной путанице.
Дата выпуска 8 мая 2000 года. Кодовое имя — Kestrel.
Дата выпуска 6 февраля 2002 года. Кодовое имя — Merlin.
Спецификация 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.
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
Java SE 6
Релиз версии состоялся 11 декабря 2006 года, кодовое имя — Mustang. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Малые изменения, как и в Java 5.0, вносятся в обычные обновления версии, например, Java Standard Edition Development Kit 6 Update 27. Внесены следующие изменения:
Дата выпуска — 8 октября 2013 года.
Java ME Embedded
Дата выпуска — 10 октября 2013 года. Кодовое имя — Micro Edition.
Java SE 7
В новой версии, получившей название 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 SE 8
Релиз версии состоялся 19 марта 2014 года. Кодовое имя — Octopus.
Java SE 9
Официальный частичный список нововведений и план релиза расположен на сайте OpenJDK.
Java SE 11
Официальный частичный список нововведений и план релиза расположен на сайте OpenJDK. Дата релиза — 25 сентября 2018 года.
- The Java Tutorials (англ.) — обучающие материалы по Java 8
- Учебник Java 8
Классификация платформ Java
Внутри Java существует несколько основных семейств технологий:
JVM in the web browser
на уровне отдельных SQL-запросов — на основе JDBC, SQLJ;на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе Java Data Objects и Java Persistence API.
Применения платформы Java
Код программы «Hello, world!».
Пример использования обобщений
// Создание объекта по шаблону.
Пример использования рефлексии
«name:%s, type:%s
»
«name:%s, return type:%s
»
Пример использования аннотаций





