Java

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:44, 22 мая 2016.
Java
Java logo.png
Парадигма Мультипарадигмальный
Спроектировано James Gosling и Sun Microsystems
Первый   появившийся 1996
Печать дисциплины статическая
Расширение файла .java, .class, .jar
Портал: http://java.com
Под влиянием
Objective-C, Ада 83, Object Pascal, UCSD Pascal, Oberon, C++, C#, Smalltalk, Eiffel, Mesa, Modula-3, Generic Java

Java[1] – это параллельный, объектно-ориентированный (а именно класс-ориентированный) язык программирования общего назначения. Java позволяет разработчикам приложений «написав однажды, запускать везде»[2]. Это означает, что скомпилированный Java-код может быть запущен на всех платформах, которые поддерживают Java, без необходимости в перекомпиляции. Приложения на Java, как правило компилируются в байт-код, который может выполняться на любой виртуальной машине Java (JVM – англ. Java Virtual Maсhine) не зависимо от компьютерной архитектуры. По состоянию на 2015 год, Java является одним из наиболее популярных используемых языков программирования, особенно в сфере разработки клиент-северных web-приложений. Изначально язык Java был разработан в компании Sun Microsystems (которая была поглощена корпорацией Oracle в период с апреля 2009 года по январь 2010 года) Джеймсом Гослингом и опубликован в 1995 году как ядро программной платформы Java. Синтаксис Java по большей части взят из языков C и C++, но низкоуровневые возможности языка значительно ограничены по сравнению с любым из них. Оригинальная и эталонная реализации компиляторов Java, виртуальных машин и библиотек классов изначально были выпущены компанией Sun под проприетарными лицензиями. По состоянию на 2007 год, в соответствии со спецификациями Java Community Process, Sun сменила лицензию большинства своих Java-технологий на Открытое лицензионное соглашение GNU (англ. GNU General Public License). Так же существуют и сторонние реализации этих технологий, такие как GNU Compiler for Java (GCJ), GNU Classpath (свободная реализация стандартной библиотеки классов языка Java) и IcedTee-Web. Последняя версия – Java 8 – в настоящее время является единственной версией, поддерживаемой Oracle бесплатно. Более ранние версии поддерживаются Oracle и другими компаниями на коммерческой основе.

История

Джеймс Гослинг, Майк Шеридан и Патрик Нейтон положили начало проекта по разработке языка Java в 1991 году. Java задумывался как язык программирования для интерактивного телевидения, но оказался слишком прогрессивным для индустрии кабельного цифрового телевидения того времени. Изначально язык носил название Oak(«Дуб»), в честь дерева, росшего под окном офиса Джеймса Гослинга. Позже проект сменил название на Green и окончательно был переименован в Java, в честь одноименного кофе. Джеймс Гослинг сделал синтаксис Java в стиле C/C++, так как такой синтаксис был хорошо знаком системным и прикладным программистам.

Компания Sun Microsystems выпустила первую официальную версию – Java 1.0 – в 1995 году. Она должна была соответствовать принципу «напиcал однажды, запускай везде» [2], позволяя запускать приложения на всех популярных платформах без дополнительных затрат на портирование. Другой важной особенностью технологии Java была гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание. Вскоре во всех основных web-браузерах была добавлена возможность запускать на web-страницах Java-апплеты, и Java быстро набрала популярность. Компилятор Java 1.0 был переписан на Java Артуром ван Хоффом для полного соответствия спецификации языка. Новая версия Java 2, выпущенная в декабре 1998 года как J2SE 1.2, имела несколько конфигураций для различных типов платформ. J2EE (Java 2 Enterprise Edition) включала в себя технологии и API- интерфейсы для корпоративных приложений, обычно выполняющихся на серверных платформах, в то время как включенные в J2ME (Java 2 Micro Edition) API-интерфейсы оптимизированы для мобильных приложений. Версия предназначенная для создания настольных приложений была переименована в J2SE (Java 2 Standard Edition). В 2006 году Sun Microsystems в маркетинговых целях сменила названия новых версий J2EE, J2ME и J2SE на Java EE, Java ME и Java SE соответственно.

В 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:

  1. Язык должен быть «простым, объектно-ориентированным и знакомым».
  2. Язык должен быть «надежным и безопасным».
  3. Язык должен быть «независимым от архитектуры и мобильным».
  4. Язык должен выполняться с «высокой эффективностью».
  5. Язык должен быть «интерпретируемым, динамическим и должен поддерживать потоки».

Версии

Основные версии Java и даты их выпуска:

  • JDK 1.0 (21 января 1996 года)
  • JDK 1.1 (19 февраля 1997 года)
  • J2SE 1.2 (8 декабря 1998 года)
  • J2SE 1.3 (8 мая 2000 года)
  • J2SE 1.4 (6 февраля 2002 года)
  • J2SE 5.0 (30 сентября 2004 года)
  • Java SE 6 (11 декабря 2006 года)
  • Java SE 7 (28 июля 2011 года)
  • Java SE 8 (18 марта 2014 года)

Практика

Платформа Java

Один из принципов в соответствии с которыми создавалась Java — это мобильность, что означает, что программы, написанные для платформы Java, должны везде работать одинаково, то есть результат их выполнения не должен зависеть от аппаратного обеспечения и операционной системы. Это достигается посредством трансляции исходного кода в промежуточного представление, называемое байт-кодом, а не в машинный код, зависимый от архитектуры. Инструкции байт-кода аналогичны командам машинного языка, но они предназначены для выполнения виртуальной машиной, реализация которой написана для конкретной архитектуры. Конечные пользователи для запуска автономных Java-приложений или Java-апплетов в web-браузере, как правило используют минимальную реализацию JVM — Java Runtime Environment (JRE), которая устанавливается на их собственной машине.Стандартные библиотеки предоставляют общий способ доступа к хост-специфичным функциям, таким как работа с графикой, потоками выполнения и сетью. Использование универсального байт-кода сильно упрощает портирование. Тем не менее из-за накладных расходов, связанных с интерпретацией байт-кода в машинные инструкции, интерпретируемые программы почти всегда работают медленнее, чем исполняемые файлы на машинном языке. Несмотря на это, JIT-компиляторы, транслирующие байт-код в машинный код во время выполнения, были введены на ранней стадии разработки. Сам по себе язык Java является платформонезависимым, его адаптацией для конкретной платформы, на которой он будет выполняться, занимается виртуальная машина Java (JVM), написанная для этой платформы. JVM транслирует байт-код Java в машинный язык платформы.

Реализации

На данный момент владельцем официальной реализацией платформы Java SE является корпорация Oracle (начиная с 27 января 2010 года, когда она купила Sun Microsystems). Эта реализация основывается на оригинальной, созданной Sun Microsystems. Она доступна для Microsoft Windows (все еще работает Windows XP, хотя официально поддерживается только последняя версия Windows), Mac OS X, Linux и Solaris. Поскольку для Java нет каких-либо официальных стандартов, признанных Ecma International, ISO / IEC, ANSI, или другой подобной организацией, то реализация Oracle является стандартом де-факто. Oracle предоставляет свою реализацию Java в виде двух различных дистрибутивов: Java Runtime Enviroment (JRE), которая предназначен для конечных пользователей и содержит часть Java SE - платформы, необходимую для запуска программ, написанных на Java, и Java Development Kit (JDK), который предназначен для разработчиков программного обеспечения и включает в себя инструменты разработки, такие как компилятор Java, Javadoc, Jar, и отладчик.

Стоит также отметить другую реализацию Java SE-платформы — OpenJDK, которая распространяется под лицензией GNU GPL. Создание проекта OpenJDK началось, когда компания Sun выпустила исходный код Java под GPL-лицензией. Начиная с версии Java SE 7, OpenJDK официально является эталонной реализацией Java.

Цель Java – сделать все реализации совместимыми. С исторической точки зрения лицензия Sun Microsystems на использование бренда Java какой либо реализацией подразумевает её совместимость с остальными. Вследствии этого возник правовой спор с корпорацией Microsoft после того, как Sun стало известно, что созданная Microsoft реализация Java не поддерживает RMI или JNI и имеет платформозависимые особенности. Компания Sun подала в суд в 1997 году и в 2001 году выиграла дело, в результате чего получила возмещение в размере 20 000 000 $, кроме того на Micsoft в судебном порядке было наложено обязательство соблюдать условия лицензионного соглашения компании Sun. В результате Micrsoft больше не поставляла Java вместе с Windows.

Платформонезависимость 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 не поддерживает перегрузку операторов или множественное наследование классов, однако же, множественное наследование поддерживается для интерфейсов. Всё это упрощает язык и помогает избежать множества возможных ошибок и использования антипаттернов при проектировании.

Java использует комментарии в стиле C++. Есть три разных стиля комментариев: однострочный комментарий — начинается сразу после // и заканчивается в конце строки, многострочный комментарий — начинается сразу после /* и заканчивается перед */, и Javadoc-комментарий — начинается сразу после /** и заканчивается перед */. Стиль Javadoc-комментирования позволяет пользователю использовать программу Javadoc для создания документации к коду.

Пример:

//Это пример однострочного комментария, полученного c использованием удвоенного слэша.

/* Это пример многострочного комментария, полученного с использованием слэша
и символа звездочки. Такой тип  может содержать много информации или может 
быть использован для деактивации кода, но нужно помнить что такой комментарий 
нужно закрывать в конце.*/

package fibsandlies;
import java.util.HashMap;

/**
 * Это пример Javadoc-комментария; Javadoc может скомпилировать документацию
 * из этого текста. Javadoc-комментарии должны стоять непосредственно перед 
 * документируемым классом, методом или полем.
 */
public class FibCalculator extends Fibonacci implements Calculator {
    private static Map<Integer, Integer> memoized = new HashMap<Integer, Integer>();

    /*
     * Метод main, написанный ниже, используется JVM как точка входа в программу.
     */
    public static void main(String[] args) {
        memoized.put(1, 1);
        memoized.put(2, 1);
        System.out.println(fibonacci(12)); //Получаем 12-е число Фибоначчи и выводим его в консоль
    }

    /**
     * Пример метода класса на Java.
     * Принимает не отрицательное число FIBINDEX, возвращает
     * число Фибоначчи с порядковым номером равным FIBINDEX.
     * @param fibIndex  Порядковый номер числа Фибоначчи
     * @return Число Фибоначчи
     */
    public static int fibonacci(int fibIndex) {
        if (memoized.containsKey(fibIndex)) {
            return memoized.get(fibIndex);
        } else {
            int answer = fibonacci(fibIndex - 1) + fibonacci(fibIndex - 2);
            memoized.put(fibIndex, answer);
            return answer;
        }
    }
}

Примеры

Программа «Hello World!»

Традиционная программа «Hello World!», написанная на Java, может быть представлена в следующем виде:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Prints the string to the console.
    }
}

Файл с исходным Java-кодом должен иметь расширение .java, а его имя должно совпадать с именем public-класса, который содержится в этом файле, например HelloWorldApp.java. Затем этот файл должен быть оттранслирован в байт-код помощью компилятора Java, в результате чего будет получен файл HelloWorldApp.class. Только после этого можно будет запустить его на выполнение. Файл с исходным кодом на Java может содержать только один public-класс, но зато он может содержать несколько классов с уровнем доступа отличным от public и любое количество внутренних public-классов.Класс, который не объявлен как public может быть сохранен в любой файл с расширением .java. Компилятор сгенерирует отдельный .class-файл для каждого класса, определенного в .java-файле. Имя файла с расширением .class совпадает с именем класса, для которого он создан (в случае анонимных классов в качестве имени берется строка, состоящая из имени внешнего класса символа $ и целого числа,например EnclosingClassName$1 ).

Ключевое слово public в объявлении метода обозначает, что этот метод может быть вызван не только из данного класса, но и из остальных. Это же ключевое слово в объявлении класса обозначает, что этот класс будет виден не только внутри пакета, в котором он объявлен, но и за его приделами. Существуют и другие ключевые слова, управляющие уровнем доступа (их называют модификаторами уровня доступа), такие как private и protected.

Ключевое слово static в объявлении метода обозначает, что метод является статическим, то есть он связан только с классом а не c конкретными экземплярами этого класса. Только такие методы могут быть вызваны без использования ссылки на объект. Статический метод не может вызывать не статические методы класса. Для работы с методами, которые не отмечены модификатором static, требуется для начала инстанцировать класс. Ключевое слово void в объявлении метода говорит о том что, метод не возвращает никакого значения в точку вызова. Если Java программа завершается с ошибкой, то она должна явно вызвать System.exit().

Имя метода "main" не является ключевым словом языка Java. Это просто имя метода, которому Java-launcher передает управление при запуске программы. Java-классы, которые работают в управляемых средах, такие как апплеты и Enterprise Java Beans, не нуждаются в методе main(). Программа на Java может содержать несколько классов, которые имеют метод main(), в таком случае необходимо явно указать виртуальной машине, какой класс она должна использовать при запуске приложения. Метод main должен принимать в качестве аргументов только массив объектов типа String. В качестве иденификатора этого массива принято использовать имя "args", но любое другое допустимое имя тоже подойдёт. Начиная с версии Java 5 метод main может принимать varargs [4] в следующей форме public static void main(String... args),это означает что метод main может быть вызван с произвольным колличеством аргументов типа String.

Эффект от такого альтернативного объявления семантически идентичен (параметр args всё так же остается массивом объектов типа String), но зато теперь есть альтернативный синтаксис создания и передачи массива в качестве параметра.

Java-launcher запускает Java приложение путем загрузки переданного класса (класса указанного в командной строке или в качестве атрибута в JAR) и вызова его метода public static void main(String[]args). Автономные программы должны объявлять этот метод явно. Параметр String[] args содержит все аргументы переданные классу. Параметры в метод main() часто передаются посредством командной строки.Печать(вывод) является частью стандартной библиотеки Java: класс System определяет public static поле с именем out. Объект out является экземпляром класса PrintStream и предоставляет множество методов для печати данных в стандартный поток вывовда, в том числе и метод println(String), который выводит строку-параметр и осуществляет переход на новую строку. Строка "Hello World!" автоматически преобразуется компилятором в объект типа String.

Строка "Hello World!" автоматически преобразуется в объект струнного компилятором.

Специальные классы

Апплеты

Java-апплеты - это программы, внедренные в другие приложения, как правило в web-страницы, отображаемые в web-браузере.

// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;

public class Hello extends JApplet {
    public void paintComponent(final Graphics g) {
        g.drawString("Hello, world!", 65, 95);
    }
}

Оператор import дает компилятору Java указание импортировать классы javax.swing.JApplet и java.awt.Graphics при компиляции. Это позволяет ссылаться на эти классы в исходном коде с помощью простого имени класса (т.е. JApplet) вместо полного имени (т.е. javax.swing.JApplet).

Класс Hello является классом потомком для JApplet, на что указывает ключевое слово extends. Класс JApplet определяет структуру хост-приложения для отображения и управления жизненным циклом апплета. Класс JApplet является JComponent (Java Graphical Component), который обеспечивает апплет возможностью отображения графического интерфейса пользователя (GUI – Graphical User Interface) и реагировать на события, инициированные пользователем.

Класс Hello переопределяет метод paintComponent (Graphics) (на что дополнительно указывает аннотация Override (поддерживается начиная с JDK 1.5)), унаследованный от суперкласса Container, чтобы дописать код для отображения апплета. Методу paintComponent() передается объект типа Graphics, который содержит графический контекст, используемый для отображения апплета. Метод paintComponent() вызывает у объекта, содержащего графический контекст метод drawString(String, Int, Int) для отображения строки "Hello, world!" в позиции со смещением (65, 95) пикселей от верхнего левого угла области, в которой отображается апплет.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- Hello.html -->
<html>
    <head>
        <title>Hello World Applet</title>
    </head>
    <body>
        <applet code="Hello.class" width="200" height="200">
        </applet>
    </body>
</html>

Апплет размещается в HTML-документе посредством HTML-элемента applet. Тег applet имеет три атрибута: атрибут code = "Hello" задает имя класса унаследованного от JApplet, а аттрибуты width = "200" и height = "200", устанавливают ширину и высоту апплета в пикселях. Апплеты так же могут быть отображены на веб-странице с помощью элементов object или embed,хотя поддержка этих элементов веб-браузерами не является последовательной.Тем не менее HTML-элемент applet считается устаревшим, и рекомендуется использовать элемент object.

Сервлеты

Технология Java Servlet предоставляет веб-разработчикам простой и надежный механизм расширения функциональности веб-сервера и доступа к существующим бизнес-системам. Сервлеты - это компоненты Java EE, используемые на стороне сервера, которые генерируют ответы (обычно HTML-страницы) на запросы клиентов (как правило HTTP-запросы). Сервлет можно рассматривать практически как апплет, который работает на стороне сервера и не имеет “лицевой” части.

// Hello.java
import java.io.*;
import javax.servlet.*;

public class Hello extends GenericServlet {
    public void service(final ServletRequest request, final ServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html");
        final PrintWriter pw = response.getWriter();
        try {
            pw.println("Hello, world!");
        } finally {
            pw.close();
        }
    }
}

Оператор import дает компилятору Java указание импортировать во время компиляции все public-классы и интерфейсы из пакетов java.io и javax.servlet. Использование пакетов делает язык Java подходящим для написания крупномасштабных приложений.Класс Hello является классом-потомком для GenericServlet, на что указывает ключевое слово extends. Класс GenericServlet предоставляет серверу интерфейс для пересылки запросов сервлету и для управления жизненным циклом сервлета.

Класс Hello переопределяет service(ServletRequest, ServletResponse) метод, объявленный в интерфейсе Servlet, чтобы дописать код для обработчика запросов на обслуживание. Методу service() передается: объект типа ServletRequest, содержащий запрос от клиента и объект типа ServletResponse, используемый для создания ответа, возвращаемого клиенту. В объявлении метода service() , указано, что он может возбуждать исключения ServletException и IOException в случае, если возникает проблема, мешающая ему ответить на запрос.

Метод объекта-ответа setContentType(String) вызывается для того чтобы установить MIME-тип "text/html" для возвращаемых данных. Метод getWriter() возвращает объект PrintWriter, который используется, для записи данных, которые передаются клиенту. Метод println(String) вызывается, чтобы написать "Hello, world!" в ответ на запрос, а затем вызывается метод сlose() объекта PrintWriter, что приводит к возврату всех данных, записанных в поток ответа, клиенту.

JavaServer Pages

JavaServer Pages (JSP) – это серверные компоненты Java EE, которые генерируют ответы, обычно в виде HTML-страниц, на HTTP-запросы, полученные от клиентов. JSP-страницы вставляют Java-код в HTML-страницу используя специальные разделители <% и %>. При первом обращении к JSP-странице её код транслируется в Java-код сервлета, то есть собственно в Java-приложение. После этого сгенерированный сервлет создает ответ.

Шаблоны в Java (generics)

В 2004 году шаблоны были добавлены в язык Java как часть J2SE 5.0. До их введения каждое объявление переменной должно было содержать тип этой переменной. Это являлось проблемой для контейнерных классов, так как не было простого способ создать контейнер, который принимает только объекты определенных типов. Либо контейнер принимал объекты всех классов, являющихся потомками некоторого базового класса (обычно класса Object) или интерфейса, либо для каждого класса нужно было создавать свой класс-контейнер. Шаблоны же позволяю проводить проверку типов во время компиляции, без необходимости создавать множество контейнерных классов, каждый из которых содержит практически один и тот же код. В дополнение к возможности писать код более эффективно, некоторые исключения времени выполнения преобразовались в ошибки времени компиляции, что известно как типобезопасность.

Критика

Критикуя Java, обычно говорят о таких её особенностях, как реализация шаблонов (generics), скорость, обработка чисел без знака, реализация арифметики чисел с плавающей запятой, и об истории уязвимостей HotSpot - основной реализации виртуальной машины Java.

Примечания

  1. Произносится на английском как /ˈdʒɑːvə/, в русском языке встречаются транслитерации «Джава» и «Ява», правообладатели торговой марки предпочитают первую транслитерацию.
  2. 2,0 2,1 Перевод англ. "write once, run anywhere" (сокр. WORA)
  3. Перевод с англ. фразы "steward of Java technology with a relentless commitment to fostering a community of participation and transparency".
  4. Сокращение термина variable-length arguments — аргументы переменной длины

Ссылки

  1. Official Java
  2. Java