Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. В отношении произношения в русском языке, как и в ряде других, образовались две различные нормы — заимствованная англоязычная /ˈdʒɑːvə/ [1] и традиционно-национальная «Ява», соответствующая традиционому произношению названия острова Ява.
Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально язык программирования назывался Oak (русск. Дуб ) и разрабатывался Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе Java, любимого программистами, поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.
Содержание
Основные особенности языка
Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java-приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология ARM).
История версий
Java 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1995 году.
Java 2.0
К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Собственно языковых изменений в данной версии не появилось. Платформа получила следующие дополнения:
Java 5
Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
Классификация платформ Java
Внутри Java существуют три основных семейства технологий:
Самыми популярными считаются серверные технологии семейства J2EE.
Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки скриптового языка Mozilla Rhino (англ.), улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Java и Microsoft
Применения платформы Java
Что такое язык программирования Java?
« Зелёная команда » продемонстрировала использование Oak в интерактивном телевизоре. Но для цифрового кабельного телевидения тех лет эта технология была слишком передовой. Одновременно с этим набирал популярность интернет, для которого новый язык программирования подходил лучше всего.
Язык программирования Java — история версий
Java — межплатформенный язык
Java — объектно-ориентированный язык программирования
Существуют различные стили программирования, и один из самых популярных — объектно-ориентированное программирование. При таком подходе сложная проблема разбивается на более мелкие путём создания объектов. Благодаря чему код можно использовать повторно.
Язык программирования Java работает быстро
Ранние версии языка программирования Java часто критиковали за медленную работу. Но сегодня ситуация кардинально поменялась. Новые версии JVM работают значительно быстрее, а интерпретирующие их процессоры становятся всё шустрее.
Java — безопасная платформа
Java представляет собой :
Обширная базовая библиотека
Одна из причин широкого распространения Java — огромная стандартная библиотека. В ней можно найти сотни классов и методов из различных пакетов, облегчающих жизнь разработчикам. К примеру,
java.lang – это продвинутые функции для строк, массивов и т.д.
java.util – библиотека для работы со структурами данных, регулярными выражениями, датой и временем и т.д.
kava.io — библиотека для ввода/вывода файлов, обработки исключений и т.д.
Применение платформы Java
Также программирование на Java используется для разработки игр, научных приложений ( к примеру, для обработки естественного языка ) и во многих других областях.
Терминология Java, которую следует знать
Java – это набор технологий ( язык программирования и компьютерная платформа ), предназначенных для создания и запуска программного обеспечения. Однако термином Java часто обозначают и сам язык программирования.
Язык программирования Java – межплатформенный объектно-ориентированный язык программирования общего назначения, обладающий широкими возможностями.
Java EE нацелена на приложения, запускаемые на серверах. Java ME создана для ограниченных по мощности устройств, таких как встраиваемые устройства. Java SE — стандартное издание Java для написания обычных программ.
JDK – Java Development Kit ( комплект Java разработчика ) содержит JRE и другие инструменты разработки, такие как компиляторы, отладчики и т.д.
Как запустить Java на Mac OS
Вот что нужно сделать для Java программирование с нуля и установки платформы на Mac OS X или macOS :
javac –version
Если Java установлена верно, на экран будет выведена версия программы ( например, javac 1.8.0_60 ).
Как запустить Java на Linux
Установите Java
Откройте терминал и наберите следующую команду для установки Java:
java –version
Установка IntelliJ IDEA
Как запустить Java на Windows (XP, 7, 8 и 10)
Для освоения Java основ программирования и запуска платформы на Windows потребуется JAVA SE Development Kit (JDK) и IDE для разработки проектов. Следуйте пошаговой инструкции, приведенной ниже:
Установка Java
Установка IntelliJ IDEA
Ваша первая программа на Java
Как освоить язык программирования Java?
Официальная документация Java
Примечание: единственный минус — официальная документация Java не всегда написана самым простым языком.
Рекомендуемые книги по Java
Java: Полное руководство (10-е издание)
Философия Java (4-е издание)
Если вы переходите на Java с другого языка программирования, эта книга для вас. Если же вы начинаете с нуля, лучше всего читать её вместе с другой.
Java 8. Карманный справочник: Скорая помощь Java-программистам
Вместо заключения
Надеемся, эта статья подтолкнёт вас к изучению Java и поможет начать работу над первыми программами.
Пожалуйста, оставьте свои комментарии по текущей теме материала. За комментарии, дизлайки, подписки, отклики, лайки низкий вам поклон!
Дайте знать, что вы думаете по данной теме статьи в комментариях. За комментарии, подписки, отклики, лайки, дизлайки огромное вам спасибо!
Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM
Ни для кого не секрет, что на данный момент Java — один из самых популярных языков программирования в мире. Дата официального выпуска Java — 23 мая 1995 года.
Эта статья посвящена основам основ: в ней изложены базовые особенности языка, которые придутся кстати начинающим “джавистам”, а опытные Java-разработчики смогут освежить свои знания.
* Статья подготовлена на основе доклада Евгения Фраймана — Java разработчика компании IntexSoft. В статье присутствуют ссылки на внешние материалы.
1. JDK, JRE, JVM
Java Development Kit — комплект разработчика приложений на языке Java. Он включает в себя Java Development Tools и среду выполнения Java — JRE (Java Runtime Environment).
Java development tools включают в себя около 40 различных тулов: javac (компилятор), java (лаунчер для приложений), javap (java class file disassembler), jdb (java debugger) и др.
Среда выполнения JRE — это пакет всего необходимого для запуска скомпилированной Java-программы. Включает в себя виртуальную машину JVM и библиотеку классов Java — Java Class Library.
JVM — это программа, предназначенная для выполнения байт-кода. Первое преимущество JVM — это принцип “Write once, run anywhere”. Он означает, что приложение, написанное на Java, будет работать одинаково на всех платформах. Это является большим преимуществом JVM и самой Java.
До появления Java, многие компьютерные программы были написаны под определенные компьютерные системы, а предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Со второй половины 1990-х годов, после появления Java, автоматическое управление памятью стало общей практикой.
Существует множество реализаций JVM, как коммерческих, так и с открытым кодом. Одна из целей создания новых JVM — увеличение производительности для конкретной платформы. Каждая JVM пишется под платформу отдельно, при этом есть возможность написать ее так, чтобы она работала быстрее на конкретной платформе. Самая распространённая реализация JVM — это JVM Hotspot от OpenJDK. Также есть реализации IBM J9, Excelsior JET.
2. Выполнение кода на JVM
Согласно спецификации Java SE, для того, чтобы получить код, работающий в JVM, необходимо выполнить 3 этапа:
3. Загрузчики классов и их иерархия
Вернемся к загрузчикам классов — это специальные классы, которые являются частью JVM. Они загружают классы в память и делают их доступными для выполнения. Загрузчики работают со всеми классами: и с нашими, и с теми, которые непосредственно нужны для Java.
Представьте ситуацию: мы написали свое приложение, и помимо стандартных классов там есть наши классы, и их очень много. Как с этим будет работать JVM? В Java реализована отложенная загрузка классов, иными словами lazy loading. Это значит, что загрузка классов не будет выполняться до тех пор, пока в приложении не встретится обращение к классу.
Иерархия загрузчиков классов
Первый загрузчик классов — это Bootstrap classloader. Он написан на C++. Это базовый загрузчик, который загружает все системные классы из архива rt.jar. При этом, есть небольшое отличие между загрузкой классов из rt.jar и наших классов: когда JVM загружает классы из rt.jar, она не выполняет все этапы проверки, которые выполняются при загрузке любого другого класс-файла т.к. JVM изначально известно, что все эти классы уже проверены. Поэтому, включать в этот архив какие-либо свои файлы не стоит.
Следующий загрузчик — это Extension classloader. Он загружает классы расширений из папки jre/lib/ext. Допустим, вы хотите, чтобы какой-то класс загружался каждый раз при старте Java машины. Для этого вы можете скопировать исходный файл класса в эту папку, и он будет автоматически загружаться.
Еще один загрузчик — System classloader. Он загружает классы из classpath’а, который мы указали при запуске приложения.
Процесс загрузки классов происходит по иерархии:
4. Структура Сlass-файлов и процесс загрузки
Перейдем непосредственно к структуре Class-файлов.
Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.
Таким образом, при загрузке классов:
5. Исполнение байт-кода на JVM
В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.
Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.
Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.
6. Компиляция
Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.
Компиляторы делятся на:
Также компиляторы могут классифицироваться по моменту компиляции:
7. Организация памяти в Java
Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.
Он нужен для того, чтобы хранить методы. Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы.
Когда вызывается любой метод в Java, создается фрейм или область памяти в стеке, и метод кладется на его вершину. Когда метод завершает выполнение, он удаляется из памяти, тем самым освобождая память для следующих методов. Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError. К примеру, это может произойти, если у нас будет рекурсивная функция, которая будет вызывать сама себя и памяти в стеке не будет хватать.
Ключевые особенности стека:
Куча разбита на несколько более мелких частей, называемых поколениями:
Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.
Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.
Ключевые особенности кучи:
Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:
У нас есть класс App, в котором единственный метод main состоит из:
— примитивной переменой id типа int со значением 23 — ссылочной переменной pName типа String со значением Jon — ссылочной переменной p типа person
Как уже упоминалось, при вызове метода на вершине стека создаётся область памяти, в которой хранятся данные, необходимые этому методу для выполнения. В нашем случае, это ссылка на класс person: сам объект хранится в куче, а в стеке хранится ссылка. Также в стек кладется ссылка на строку, а сама строка хранится в куче в String pool. Примитив хранится непосредственно в стеке.
Для вызова конструктора с параметрами Person (String) из метода main() в стеке, поверх предыдущего вызова main() создается в стеке отдельный фрейм, который хранит:
— this — ссылка на текущий объект — примитивное значение id — ссылочную переменную personName, которая указывает на строку в String Pool.
После того, как мы вызвали конструктор, вызывается setPersonName(), после чего снова создается новый фрейм в стеке, где хранятся те же данные: ссылка на объект, ссылка на строку, значение переменной.
Таким образом, когда выполнится метод setter, фрейм пропадет, стек очистится. Далее выполняется конструктор, очищается фрейм, который был создан под конструктор, после чего метод main() завершает свою работу и тоже удаляется из стека.
Если будут вызваны другие методы, для них будут также созданы новые фреймы с контекстом этих конкретных методов.
8. Garbage collector
В куче работает Garbage collector — программа, работающая на виртуальной машине Java, которая избавляется от объектов, к которым невозможно получить доступ.
Разные JVM могут иметь различные алгоритмы сборки мусора, также существуют разные сборщики мусора.
Мы поговорим о самом простом сборщике Serial GC. Сборку мусора мы запрашиваем при помощи System.gc().
Как уже было упомянуто выше, куча разбита на 2 области: New generation и Old generation.
New generation (младшее поколение) включает в себя 3 региона: Eden, Survivor 0 и Survivor 1.
Old generation включает в себя регион Tenured.
Что происходит, когда мы создаем в Java объект?
В первую очередь объект попадает в Eden. Если мы создали уже много объектов и в Eden уже нет места, срабатывает сборщик мусора и освобождает память. Это, так называемая, малая сборка мусора — на первом проходе он очищает область Eden и кладёт “выжившие” объекты в регион Survivor 0. Таким образом регион Eden полностью высвобождается.
Если произошло так, что область Eden снова была заполнена, garbage collector начинает работу с областью Eden и областью Survivor 0, которая занята на данный момент. После очищения выжившие объекты попадут в другой регион — Survivor 1, а два остальных останутся чистыми. При последующей сборке мусора в качестве региона назначения опять будет выбран Survivor 0. Именно поэтому важно, чтобы один из регионов Survivor всегда был пустым.
JVM следит за объектами, которые постоянно копируются и перемещаются из одного региона в другой. И для того, чтобы оптимизировать данный механизм, после определённого порога сборщик мусора перемещает такие объекты в регион Tenured.
Когда в Tenured места для новых объектов не хватает, происходит полная сборка мусора — Mark-Sweep-Compact.
Во время этого механизма определяется, какие объекты больше не используются, регион очищается от этих объектов, и область памяти Tenured дефрагментируется, т.е. последовательно заполняется нужными объектами.
Национальная библиотека им. Н. Э. Баумана Bauman National Library
Персональные инструменты
Содержание
История
Джеймс Гослинг, Майк Шеридан и Патрик Нейтон положили начало проекта по разработке языка Java в 1991 году. Java задумывался как язык программирования для интерактивного телевидения, но оказался слишком прогрессивным для индустрии кабельного цифрового телевидения того времени. Изначально язык носил название Oak(«Дуб»), в честь дерева, росшего под окном офиса Джеймса Гослинга. Позже проект сменил название на Green и окончательно был переименован в Java, в честь одноименного кофе. Джеймс Гослинг сделал синтаксис Java в стиле C/C++, так как такой синтаксис был хорошо знаком системным и прикладным программистам.
В 1997 году компания Sun Microsystems обратилась к комитету по стандартизации ISO/IEC JTC 1 и позже к Ecma International с целью создания официального стандарта Java, но вскоре отказалась от этой идеи. Java продолжила подчиняется стандарту де-факто, который контролируется посредством Java Community Process. В то же время Sun Microsystems предоставила свободный доступ к большинству своих реализаций Java, но при этом они имели статус проприетарного програмного обеспечения. Sun получала доход от Java за счет продажи лицензий для специализированных продуктов, таких как Java Enterprise Systems.
13 ноября 2006 года, Sun опубликовала большую часть кода своей JVM в качестве свободного программного обеспечения с открытым исходным кодом (FOSS – англ. Free and Open-Source Software), в соответствии с условиями GNU General Public License. 8 мая 2007 года почти весь код виртуальных машин Java компании Sun Microsystems распространялся как FOSS, исключение составляла только небольшая часть кода, на которую у компании не было авторских прав.
Вице-президент компании Sun Рич Грин заявил, что Sun выполняет роль «евангелиста» по отношению к Java. Корпорация Oracle после поглощения Sun Microsystems описала свою роль как «распорядитель технологии Java с неослабевающим обязательством содействовать сообществу соучастия и открытости». [3] Но практически сразу после этого заявления Oracle подает иск против Google за использование Java в Android SDK. Программное обеспечение написанное на Java работает везде, начиная от ноутбуков и игровых консолей и заканчивая дата-центрами и суперкомпьютерами. 2 апреля 2010 года Джеймс Гослинг ушел из Oracle.
Принципы
Пять основных принципов, в соответствии с которыми создавался язык Java:
Версии
Основные версии Java и даты их выпуска:
Практика
Платформа Java
Один из принципов в соответствии с которыми создавалась Java — это мобильность, что означает, что программы, написанные для платформы Java, должны везде работать одинаково, то есть результат их выполнения не должен зависеть от аппаратного обеспечения и операционной системы. Это достигается посредством трансляции исходного кода в промежуточного представление, называемое байт-кодом, а не в машинный код, зависимый от архитектуры. Инструкции байт-кода аналогичны командам машинного языка, но они предназначены для выполнения виртуальной машиной, реализация которой написана для конкретной архитектуры. Конечные пользователи для запуска автономных Java-приложений или Java-апплетов в web-браузере, как правило используют минимальную реализацию JVM — Java Runtime Environment (JRE), которая устанавливается на их собственной машине.Стандартные библиотеки предоставляют общий способ доступа к хост-специфичным функциям, таким как работа с графикой, потоками выполнения и сетью. Использование универсального байт-кода сильно упрощает портирование. Тем не менее из-за накладных расходов, связанных с интерпретацией байт-кода в машинные инструкции, интерпретируемые программы почти всегда работают медленнее, чем исполняемые файлы на машинном языке. Несмотря на это, JIT-компиляторы, транслирующие байт-код в машинный код во время выполнения, были введены на ранней стадии разработки. Сам по себе язык Java является платформонезависимым, его адаптацией для конкретной платформы, на которой он будет выполняться, занимается виртуальная машина Java (JVM), написанная для этой платформы. JVM транслирует байт-код Java в машинный язык платформы.
Реализации
Стоит также отметить другую реализацию Java SE-платформы — OpenJDK, которая распространяется под лицензией GNU GPL. Создание проекта OpenJDK началось, когда компания Sun выпустила исходный код Java под GPL-лицензией. Начиная с версии Java SE 7, OpenJDK официально является эталонной реализацией Java.
Платформонезависимость Java особенно важна для Java EE. И для сертификации рализации Java EE требуются более строгие проверки, так как это серверная платформа для задач средних и крупных предприятий.
Производительность
Программы написанные на Java имеют репутацию более медленных и более затратных по памяти, чем аналогичные программы на С++. Тем не менее скорость выполнения Java-программ значительно возросла с внедрением JIT-компиляции в версии Java 1.1 в 1997/1998 году, с добавлением новых языковых возможностей, позволяющих более эффективно анализировать код (например добавление внутренних классов, класса StringBuilder, условных утверждений (asssertions) и т.п.) и с оптимизацией JVM (например более эффективная виртуальная машина — HotSpot — стала основной с выходом Java 1.3).
Некоторые платформы осуществляют поддержку Java на уровне аппаратного обеспечения. Есть микроконтроллеры которые могут выполнять Java-команды на аппартном уровне без использования программной реализации виртуальной машины Java, и ARM-процессоры, которые могут поддерживают выполнение байт-кода Java посредством технологии Jazelle (поддержка этой технологии снизилась в последних реализациях ARM-процессоров).
Автоматическое управление памятью
В Java для управления памятью в жизненном цикле объектов используется автоматический сборщик мусора. Программист определяет, когда создаются объекты, а среда выполнения Java несет ответственность за освобождение памяти, занимаемой объектами, которые больше не используются. То есть сборщик мусора автоматически освобождает участки памяти, на которые больше нет ссылок. Тем не менее что-то подобное утечкам памяти все еще может произойти, если код программиста содержит ссылку на объект, который больше не нужен. Как правило это встречается когда объекты, которые больше не нужны, хранятся в контейнерах, которые всё ещё используются. Если вызывается метод несуществующего объекта, то возбуждается соответствующее исключение — NullPointerException.
Одна из идей, лежащих в основе модели автоматического управления памятью Java, заключается в том, что программисты могут быть избавлены от сложностей, которые могут возникать при ручном управлении памятью. В некоторых языках память для создания объектов неявно выделяется в стеке, либо явно выделяется и освобождается в куче. В последнем случае ответственность за управление памятью ложиться на программиста. Если программист не удаляет объект, возникает утечка памяти. Если программа пытается получить доступ или освободить участок памяти, который уже был освобожден, то результат такого поведения не определён, то есть трудно предсказать продолжит ли программа нестабильно работать и/или аварийно завершится. Эта проблема может быть частично решена путем использования умных указателей (англ. smart pointer), но такой подход сопряжен с увеличением сложности и накладных расходов. Не стоит забывать, что сбор мусора не мешает появлению «логических» утечек памяти, то есть ситуаций, когда остаются более не используемые ссылки/указатели.
Сбор мусора может произойти в любой момент. В идеале, это произойдёт, когда программа находится в режиме ожидания. Сбор мусора гарантированно срабатывает, когда при попытке выделить из кучи память для нового объекта, оказывается, что свободной памяти не хватает; это может привести к зависанию программы на время работы сборщика мусора. В Java нет возможности явного управления памятью.
Java не поддерживает арифметические операции с указателями в стиле С или С++, где адреса объектов могут быть заменены беззнаковыми числами (обычно типа long int). Это позволяет сборщику мусора перемещать объекты, на которые ссылаются ссылки и обеспечивать типобезопасность и безопасность в целом.
Так же как в C ++ и некоторых других объектно-ориентированные языках, значения переменных примитивных типов в Java хранятся непосредственно как часть объекта (в случае полей объекта) или в стеке (в случае локальных переменных), так же в стеке обычно хранятся локальные объекты метода (см. Escape-Analysis). Это осознанное решение разработчиков Java, принятое с целью повышения производительности.
В Java есть несколько типов сборщиков мусора. По умолчанию, виртуальная машина HotSpot использует сборщик мусора PS Scavenge. Тем не менее есть и другие, которые могут быть использованы для управления кучей. Для 90% приложений на Java достаточно сборщика мусора Concurrent Mark-Sweep. Oracle стремится заменить его на Garbage-first (G1).
Синтаксис
C++ оказал сильное влияние на синтаксис Java. Но в отличие от C ++, синтаксис которого сочетает в себе особенности структурного, обобщенного, и объектно-ориентированного программирования, Java был построен практически полностью как объектно-ориентированный язык. Весь код пишется внутри классов, и каждый элемент данных является объектом, за исключением примитивных типов данных, то есть целочисленных типов, типов чисел с плавающей запятой, логических и символьных типов, которые не являются объектами в целях повышения производительности.В отличие от C ++, Java не поддерживает перегрузку операторов или множественное наследование классов, однако же, множественное наследование поддерживается для интерфейсов. Всё это упрощает язык и помогает избежать множества возможных ошибок и использования антипаттернов при проектировании.
Примеры
Программа «Hello World!»
Традиционная программа «Hello World!», написанная на Java, может быть представлена в следующем виде:
Эффект от такого альтернативного объявления семантически идентичен (параметр args всё так же остается массивом объектов типа String ), но зато теперь есть альтернативный синтаксис создания и передачи массива в качестве параметра.
Строка «Hello World!» автоматически преобразуется в объект струнного компилятором.
Специальные классы
Апплеты
Оператор import дает компилятору Java указание импортировать классы javax.swing.JApplet и java.awt.Graphics при компиляции. Это позволяет ссылаться на эти классы в исходном коде с помощью простого имени класса (т.е. JApplet) вместо полного имени (т.е. javax.swing.JApplet).
Сервлеты
Метод объекта-ответа setContentType(String) вызывается для того чтобы установить MIME-тип «text/html» для возвращаемых данных. Метод getWriter() возвращает объект PrintWriter, который используется, для записи данных, которые передаются клиенту. Метод println(String) вызывается, чтобы написать «Hello, world!» в ответ на запрос, а затем вызывается метод сlose() объекта PrintWriter, что приводит к возврату всех данных, записанных в поток ответа, клиенту.
JavaServer Pages
Шаблоны в Java (generics)
В 2004 году шаблоны были добавлены в язык Java как часть J2SE 5.0. До их введения каждое объявление переменной должно было содержать тип этой переменной. Это являлось проблемой для контейнерных классов, так как не было простого способ создать контейнер, который принимает только объекты определенных типов. Либо контейнер принимал объекты всех классов, являющихся потомками некоторого базового класса (обычно класса Object) или интерфейса, либо для каждого класса нужно было создавать свой класс-контейнер. Шаблоны же позволяю проводить проверку типов во время компиляции, без необходимости создавать множество контейнерных классов, каждый из которых содержит практически один и тот же код. В дополнение к возможности писать код более эффективно, некоторые исключения времени выполнения преобразовались в ошибки времени компиляции, что известно как типобезопасность.