Java

Продукт
Разработчики: Oracle
Дата последнего релиза: 2014/03/18
Технологии: Средства разработки приложений

Содержание

Javaобъектно-ориентированный язык программирования, разработанный компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. Иногда на русском языке неправильно произносят название как «Ява», по аналогии с названием острова Ява.

Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.

Основные особенности языка

Изначально новый язык программирования назывался Oak (в переводе с англ. - "Дуб") и разрабатывался Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе Ява (Java), любимого программистами, поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.

Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее.

Достоинство подобного способа выполнения программ — в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java-приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.

Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии JIT (Just-In-Time compilation), позволяющей переводить байт-код в машинный код во время исполнения программы с возможностью сохранения версий класса в машинном коде, широкое использование native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

Идеи, заложенные в концепцию и различные реализации JVM, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых в среде JVM[1]. Эта идея перекликается с концепцией CLI, заложенной в основу платформы .NET компании Microsoft.

Контроль за разработкой и права на Java

Oracle приобрела разработчика Java

Oracle получила контроль над Java в ходе покупки Sun Microsystems.

25 января 2012 года Oracle представила JCP предложение, согласно которому предполагается некоторое сокращение количества членов исполнительного комитета.

«Представляется, что в ожидании конвергенции Java ME и Java SE нынешнее разделение на два отдельных исполнительных комитета не имеет смысла. Поскольку Java является одной платформой, она и должна находиться под контролем одного исполнительного комитета», - говорится в тексте рекомендации.

Это - второе предложение Oracle.

Согласно записям 2011 года в блоге председателя JCP Патрика Каррана (Patrick Curran), первое и уже принятое было нацелено на повышение прозрачности процессов спецификации.

Третье, которое ещё только должно быть представлено, будет касаться «более комплексных перемен», включающих возможные изменения в соглашении об участии в разработке спецификации Java (Java Specification Participation Agreement), юридического соглашения, согласно которому действует JCP.

Отец Java требует для своего детища "свободы от Oracle"

Создатель языка Java Джеймс Гослинг, ушедший из Sun Microsystems после поглощения ее корпорацией Oracle, ведет пропагандистскую кампанию под девизом "Свободу Java!". Гослинг ставит своей целью добиться от главы Oracle Ларри Эллисона преобразования организации Java Community Process в независимую, не подверженную влиянию отдельных компаний. Создать такое независимое объединение сам Эллисон предложил еще в 2007 году.

В преддверии конференций JavaOne и Oracle OpenWorld 2010 Гослинг выпустил серию пропагандистских материалов в поддержку своей борьбы: футболок, значков, кружек с надписями "Освободите Java!", "Oracle, выполни обещание!", а также с портретом Эллисона и подписью "На дворе уже давно не 1984-й!". Создатель Java призывает приходить в его футболках на упомянутые конференции, чтобы продемонстрировать свое неравнодушие к судьбе платформы.

2010: Oracle начинает суд с Google по теме Java

В октябре 2010 года компания Oracle уточнила формулировки иска против Google по поводу нарушения патентов и авторских прав на технологии Java, реализованные в мобильной операционной системе Android. В первом варианте иска, направленном в суд в августе 2010 года, содержалось мало технических подробностей, но теперь компания прилагает к иску даже выдержки из исходных текстов программ.

Oracle утверждает, что примерно треть пакетов в программном интерфейсе (API) Android являются производными от пакетов Java, авторские права на которые принадлежат Oracle. Это касается, помимо прочего, названий классов и методов, параметров, определений и общей организации кода и документации. Часть исходного кода была непосредственно взята из защищенных авторскими правами текстов программ Oracle. Лицензии на использование Java сами по себе бесплатны, но в системе Android вместо виртуальной машины Java применяется машина Dalvik собственной разработки Google, программы для которой, однако, пишутся на языке Java. В Google считают, что претензии Oracle к ней и к сообществу разработчиков программ с открытым кодом в целом необоснованны.

2011: Выборы в комитет Java Community Process

C 3 ноября 2011 года VMware больше не является членом исполнительного комитета Java Community Process SE/EE[2], но в его состав вошла компания Twitter, согласно результатам выборов.

В состав исполнительного комитета по контролю над разработкой будущих версий спецификаций платформ языка Java, в частности для настольных компьютеров и серверов, вошла компания Azul Systems, производитель виртуальной Java-машины Zing. Ericsson, Intel и SAP повторно избраны в состав комитета. Кроме того, IBM, Nokia и SK Telecom сохранили за собой места в комитете по мобильным технологиям (Java ME), ARM Limited и Werner Keil получили места открытого членства.

Несмотря на выход из состава исполнительного комитета, VMware остается важным инвестором в разработку платформ Java посредством участия своего подразделения SpringSource, которое реализует широкий ассортимент продуктов для разработки и развертывания Java-приложений.

Согласно сообщению в официальном блоге компании Oracle, почти четверть (около 23%) правомочных членов голосовали на выборах.

«Это гораздо больше, чем 11% принявших участие во внеочередных выборах исполнительного комитета в 2011 году, но меньше, чем ожидалось», - говорится в сообщении.

Oracle имеет постоянное членство в комитете, но согласно регулирующим документам сообщества, не имеет возможности доминирования в JCP. В документе говорится, в частности, что Oracle и другие члены исполнительного комитета осуществляют функции групп технологического надзора за работой экспертных групп. «Исполнительные комитеты не осуществляют ежедневное непосредственное управление работой экспертных групп. У исполкомов существует возможность контроля работы каждой группы экспертов, в четко обозначенных интервалах, по мере того, как спецификации проходят через JCP», - отмечается в документе.

Тем не менее, Oracle агрессивно защищает свою долю в Java. Свидетельством чего служит судебный процесс против Google за предполагаемые нарушения интеллектуальной собственности в части применения Java в мобильной ОС Android. Имеются подозрения, что в прошлом Oracle пыталась оказать кулуарное влияние на выборы членов JCP.

Сообщество JCP лишилось такого авторитетного участника как Apache Software Foundation, которая отказалась от членства в связи с теми признаками, которые охарактеризовала как чрезмерный контроль Oracle над Java.

[2] Java Community Process (JCP) — официальное сообщество, организованное в 1998 году для участия заинтересованных компаний в формировании спецификаций платформ языка Java.

SE/EE занимается платформами для настольных компьютеров (Java Platform, Standard Edition) и для серверов (Java Platform, Enterprise Edition)

2012: Победа Google

В мае 2012 года Федеральный суд Калифорнии не усмотрел нарушений со стороны Google и не признал интеллектуальной собственностью Oracle интерфейсы программирования и строки исходного кода Java. Oracle подала апелляцию.

2014: Верховный суд рассматривает спор Oracle и Google

В мае 2014 года Федеральный апелляционный суд США отменил вынесенное в пользу Google решение. За обжалованием этого постановления Google обратилась в Верховный суд США. [3]

В начале декабря 2014 года Oracle направила в Верховный суд США обращение, в котором попросила оставить в силе решение апелляционного суда. Одновременно американский представитель Фемиды получил документ, в котором видные деятели компьютерных наук поддерживают Google.

«Оставить незащищенными тысячи строчек кода, скопированные Google, означало бы лишение защиты авторских прав в отношении всего кода», — говорится в заявлении Oracle.

Google парирует это тем, что у нее не было выбора, кроме как воспользоваться готовыми компонентами Java для разработки ОС Android, поскольку Java уже был сильно распространен, а программистам нужны были знакомые программные интерфейсы для написания Java-софта. Такой функциональный код не попадает под защиту американского законодательства об авторских правах, утверждают в Google.

Патентная тяжба Oracle и Google отразится на софтверном рынке

Патентная тяжба Oracle и Google отразится на софтверном рынке

На сторону Google встал ряд видных специалистов по компьютерным наукам. Один из создателей интернета Винтон Серф (Vinton Cerf), разработчик операционной системы Unix Кен Томпсон (Ken Thompson) и еще несколько десятков известных ветеранов ПК-отрасли направили в Верховный суд письмо, в котором попросили пересмотреть решение апелляционного суда и признать, что программные интерфейсы не являются объектом авторского права.

По словам авторов обращения, ситуация, при которой программисты, создавая свои программные интерфейсы для приложений, будут беспокоиться о приобретении лицензии на API, сильно затормозит развитие инноваций и создаст серьезный барьер на пути налаживания совместимости программных продуктов.

Возможность свободного использования сторонних API способствует созданию программного обеспечения, до которого разработчики оригинальных интерфейсов программирования никогда бы не додумались или не смогли бы создать из-за отсутствия необходимых ресурсов, говорят специалисты.

Вердикт Верховного суда может оказаться определяющим для развития всей софтверной отрасли. Если решения API будут признаны интеллектуальной собственностью, то пострадает совместимость и переносимость продуктов, поскольку под вопросом окажется легальность создания функциональных аналогов программных платформ путем разработки собственных совместимых API.

Классификация платформ Java

Внутри Java существуют три основных семейства технологий:

  • J2EE или Java EE (начиная с v1.5) — Java Enterprise Editon, для создания программного обеспечения уровня предприятия;
  • J2SE или Java SE (начиная с v1.5) — Java Standard Editon, для создания пользовательских приложений, в первую очередь — для настольных систем;
  • J2ME, Java ME или Java Micro Edition, для использования в устройствах, ограниченных по вычислительной мощности, в том числе мобильных телефонах, PDA, встроенных системах

Самыми популярными считаются серверные технологии семейства J2EE.

Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки XML, а также добавлена поддержка скриптового языка JavaScript на основе механизма Mozilla, улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.

История версий

Java 1.0

Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1995 году.

Java 2.0

К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Собственно языковых изменений в данной версии не появилось. Платформа получила следующие дополнения:

  • Набор средств для создания визуального интерфейса пользователя Swing.
  • Коллекции.
  • Поддержка файлов Policy и цифровых сертификатов пользователя.
  • Библиотека Accessibility.
  • Java 2D.
  • Поддержка технологии drag-and-drop.
  • Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.
  • Поддержка воспроизведения аудио-файлов нескольких популярных форматов.
  • Полная поддержка технологии CORBA.
  • JIT-компилятор, улучшенная производительность.
  • Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ

Java 5

Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:

  • Перечислимые типы (enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
    • Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе скрытые и абстрактные.
    • Перечисление может реализовывать интерфейсы.
    • Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым.

  • Аннотации — возможность добавления в текст программы метаданных, не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода.
  • Средства обобщённого программирования (generics) — механизм, аналогичный шаблонам в C++ или C#, дающий возможность создавать классы и методы с полями и параметрами произвольного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.
  • Методы с неопределённым числом параметров.
  • Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int — Integer). Наличие такой возможности упрощает код, поскольку исключает необходимость в выполнении явных преобразований типов в очевидных случаях.
  • Разрешён импорт статических переменных.
  • В язык введён цикл по коллекции объектов (итератор).

Java 7

  • В июне 2011 г. компания Oracle выпустила релиз-кандидат платформы Java 7. Официальный выпуск этой долгожданной новой версии должен состояться 28 июля 2011 года. После 5 лет фактического застоя, прошедших с момента выпуска Java 6, многие пользователи и разработчики Java-приложений ждут от новой платформы серьезных изменений, приближающих платформу Java к современным реалиям.

Самым заметным новшеством в Java 7, по словам самих разработчиков, должен стать набор новых программных интерфейсов API для организации ввода/вывода под общим названием JSR 203. Впервые технология Java получила настоящий доступ к реальным файловым системам – это позволяет работать с символическими ссылками и получать доступ к функциям каждой конкретной файловой системы. Новый базовый механизм для ветвления и объединения потоков JSR 166y был переработан по инициативе известного специалиста по конкурентной многозадачности Дуга Леа (Doug Lea). Обеспечивая настоящий параллелизм, технология Java теперь полностью готова к работе в многоядерных вычислительных средах. Также платформа Java 7 предлагает технологию JSR 292, которая обеспечивает поддержку динамически типизируемых языков программирования в виртуальных Java-машинах (JVM).

Релиз-кандидат Java 7 включает в себя всего 13 изменений по сравнению с последней рабочей сборкой продукта. Более половины из этих изменений – это чисто административные исправления, а вот остальные являются настоящими откровениями, исправляя такие серьезные ошибки, как сбои виртуальных машин и некорректная JIT-трансляция в среде Eclipse.

Java 9 отложена до 2017

2 декабря 2015 года разработчики из Oracle сообщили, что они не вписываются в опубликованный ранее график подготовки Java 9[4].

Согласно заявлению, им потребуется ещё около полугода чтобы довести проект Jigsaw до подобающего продукту вида, развивающего значимые для Java средства разбиения программ и JDK на модули.

На 2 декабря 2015 года для утверждения подготовлен график, в соответствии с которым релиз JDK 9 переносится с 22 сентября 2016 года на 23 марта 2017 года. Завершение разработки необходимого функционала ожидается 25 мая 2016 года, а не 10 декабря 2015 года, как планировалось изначально.

Применения платформы Java

Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: Amazon, eBay, Flickr, Google (Gmail), Yandex, LinkedIn.

Следующие компании в основном фокусируются на Java (J2EE) технологиях, а не на .NET, хотя имеют дело также и с последними: SAP, IBM, Oracle.

Основные возможности

  • автоматическое управление памятью
  • расширенные возможности обработки исключительных ситуаций;
  • богатый набор средств фильтрации ввода/вывода;
  • набор стандартных коллекций, таких как массив, список, стек и т. п.;
  • наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI);
  • наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
  • встроенные в язык средства создания многопоточных приложений;
  • унифицированный доступ к базам данных на основе JDBC и SQLJ.
  • поддержка шаблонов (начиная с версии 1.5)

Пространство имён

Идея пространств имён воплощена в Java-пакетах.

Пример программы

Программа, выводящая «Hello, World!»: <source lang="java"> public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }</source>

Пример использования коллекции: <source lang="java"> import java.util.*; public class Sample { public static void main(String[] args) { // Создание объекта коллекции. List<String> strings = new ArrayList<String>(); strings.add("Hello"); strings.add("world"); strings.add("!"); for (String s : strings) { System.out.print(s); System.out.print(" "); } } }</source>

Основные идеи

Примитивные типы

В языке Java только 8 скалярных типов: boolean, byte, char, short, int, long, float, double.

Классы-обёртки примитивных типов
  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double
  • java.lang.Boolean
  • java.lang.Character

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte. Типы float и double могут иметь специальные значения +INFINITY, -INFINITY и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float — так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы.

Тип Длина (в байтах) Диапазон или набор значений
boolean не определено 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, а также -INFINITY, INFINITY, NaN
double 8 -(2-2-52)·21023..(2-2-52)·21023, или примерно −1.8·10308..1.8·10308, а также -INFINITY, INFINITY, NaN

Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java и одной из причин её успеха. Тем не менее одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp, запрещающее повышение точности.

Преобразования при математических операциях

В языке Java действуют следующие правила:

  1. Если один операнд имеет тип double, другой тоже преобразуется к типу double.
  2. Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
  3. Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
  4. Иначе оба операнда преобразуется к типу int.

Последнее правило отличает Java от старых реализаций C и C++ и делает код более безопасным. Так, например, в языке Java после выполнения кода <source lang="java">short x = 50, y = 1000; int z = x*y; </source> переменной z присваивается значение 50000, а не −15536, как в большинстве безнадёжно устаревших реализаций C и C++. В программе, скомпилированной MS VC++, начиная с версии 7, а также многими другими современными компиляторами (gcc, Intel C++, Borland C++, Comeau и т.д.), значение будет также равно 50000.

Объектные переменные, объекты, ссылки и указатели

В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, в Java нельзя писать: <source lang="java"> double a[10][20]; Foo b(30); </source> а нужно: <source lang="java"> double[][] a = new double[10][20]; Foo b = new Foo(30); </source>

При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций разыменовывания — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.

Объектными являются переменные любого типа, кроме простых числовых типов. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование, в частности:

  • Нельзя преобразовывать объект типа int или любого другого примитивного типа в указатель или ссылку и наоборот.
  • Над ссылками запрещено выполнять операции ++, −−, +, − или любые другие арифметические операции.
  • Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано и во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности.
  • В Java нет операций взятия адреса (&) или взятия объекта по адресу (*). Звёздочка в Java означает умножение, и только. Амперсанд (&) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»).

Благодаря таким специально введенным ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя ссылки, не указывающие ни на что, есть: значение такой ссылки обозначается null).

Дублирование ссылок и клонирование

Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать <source lang="java"> Foo foo, bar;

bar = foo; </source> то произойдет копирование адреса из переменной foo в переменную bar. То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo, будет менять объект, с которым связана переменная bar, и наоборот. Если же необходимо получить именно ещё одну копию исходного объекта, пользуются или методом (функцией-членом, в терминологии C++) clone(), создающим копию объекта, или же копирующим конструктором.

Метод clone() требует, чтобы класс реализовывал интерфейс Cloneable (об интерфейсах см. ниже). Если класс реализует интерфейс Cloneable, по умолчанию clone() копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone(). Определение и использование метода clone() часто является нетривиальной задачей [1].

Сборка мусора

В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на освобождение памяти, является присваивание переменной пустого значения null. Это, однако, не значит, что объект, заменённый значением null, будет непременно и немедленно удалён. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.

Классы и функции

Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член», а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin(), а есть метод Math.sin() класса Math (содержащего, кроме sin(), методы cos(), exp(), sqrt(), abs() и многие другие).

Статические методы и поля

Для того чтобы не надо было создавать объект класса Math (и других аналогичных классов) каждый раз, когда надо вызвать sin() (и другие подобные функции), введено понятие статических методов (static method)(иногда в русском языке они называются статичными). Статический метод (отмечаемый ключевым словом static в описании) можно вызвать, не создавая объекта его класса. Поэтому можно писать <source lang="java">double x = Math.sin(1);</source> вместо <source lang="java">Math m = new Math(); double x = m.sin(1);</source> Ограничение, накладываемое на статические методы, заключается в том, что в объекте this они могут обращаться только к статическим полям и методам.

Статические поля имеют тот же смысл, что и в C++: каждое существует только в единственном экземпляре.

Финальность

Ключевое слово final (финальный) означает разные вещи при описании переменной, метода или класса. Финальная переменная инициализируется при описании и дальше не может быть изменена. Финальный метод не может быть переопределён при наследовании. Финальный класс не может иметь наследников вообще.

Абстрактность

В Java методы, не объявленные явно как final или private, являются виртуальными в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.

Абстрактным методом (описатель abstract) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не тело. Абстрактный метод определяется в классах-наследниках. В C++ то же самое называется чисто виртуальной функцией. Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя, потому что на не известен размер памяти, который необходимо выделить пол объект такого класса.

Интерфейсы

Высшей степенью абстрактности в Java является интерфейс (interface). Все методы интерфейса абстрактны: описатель abstract даже не требуется. Интерфейс не является классом. Класс может наследовать, или расширять (extends) другой класс или реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или расширять другой интерфейс.

В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов.

Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их типов.

Маркерные интерфейсы

В Java есть некоторые интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM. Это интерфейсы:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.Remote

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

Начиная с версии Java 5 в языке появился механизм обобщённого программирования — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.

<source lang="java"> // Объявление обобщённого класса class GenericClass<E> { E getFirst() { ... } void add(E obj) { ... } }

// Использование обобщённого класса в коде GenericClass <String> var = new GenericClass<String>(); var.add("qwerty"); String p = var.getFirst(); </source>

Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <T extends A & B & C...> требует, чтобы тип-параметр T реализовывал интерфейсы A, B, C и так далее, а конструкция <T super C> требует, чтобы тип-параметр T был типом C или одним из его предков.

В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.

Проверка принадлежности к классу

В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).

Далее, функция getClass(), определённая для всех объектов, выдаёт объект типа 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()<code> всегда вернёт <code>true. В паре с упомянутыми функциями объекта типа Class используются также функции isInstance() (эквивалентно instanceof), а также cast() (преобразует параметр в объект выбранного класса).

Библиотеки классов

  • JDK — содержит набор базовых классов для всего ПО на платформах Java SE и Java EE
  • CDK — для создания химического ПО
  • MARF — модульная библиотека для распознавания аудио

Средства разработки ПО

  • Oracle Java Development Kit — помимо набора библиотек для платформ Java SE и Java EE содержит компилятор командной строки javac и набор утилит, также работающих в режиме командной строки.
  • NetBeans IDE — бесплатная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Sun Microsystems, разработчиком Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.).
  • Eclipse — бесплатная интегрированная среда разработки для Java SE и Java EE. Ведутся работы по поддержке в Eclipse платформы Java ME. Пропагандируется IBM, одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.)
  • IntelliJ IDEA — коммерческая среда разработки для платформ Java SE, Java EE и Java ME.

Популярность Java

2013: К Java вернулся статус самого популярного языка программирования

Несмот­ря на все про­бле­мы с без­опас­но­стью, об­на­ру­жен­ные в по­след­нее время, Java вер­нул себе пер­вое место в еже­ме­сяч­ном рей­тин­ге по­пу­ляр­но­сти язы­ков про­грам­ми­ро­ва­ния Tiobe Programming Community Index. До этого целых де­сять ме­ся­цев пер­вое место за­ни­мал Си. В самой ком­па­нии Tiobe счи­та­ют, что по­пу­ляр­ность Java вы­рос­ла бла­го­да­ря успе­ху Android-фонов.

Итак, у Java те­перь рей­тинг по­пу­ляр­но­сти 18,387%, а у Си — 17,080. В де­сят­ку также вошли Objective-C (9,803), C++ (8,758), C# (6,680), PHP (5,074), Python (4,949), Visual Basic (4,648), Perl (2,252) и Ruby (1,752). По­пу­ляр­ность Python среди ин­тер­пре­та­то­ров рас­тет, и вско­ре он может обой­ти PHP, по­ла­га­ют в Tiobe.

В Tiobe оце­ни­ва­ют по­пу­ляр­ность язы­ков по ко­ли­че­ству про­грам­ми­стов, кур­сов обу­че­ния и по­став­щи­ков ин­стру­мен­таль­ных средств. Пер­вое место Java под­твер­жда­ет еще один рей­тинг, PyPL Popularity of Language, со­глас­но ко­то­ро­му ре­зуль­тат языка 29%. У PyPL иная ме­то­ди­ка под­сче­та — по ко­ли­че­ству по­ис­ко­вых за­про­сов, ка­са­ю­щих­ся ру­ко­водств по язы­кам про­грам­ми­ро­ва­ния. Со­глас­но PyPL, на вто­ром месте сей­час PHP (14,6), за ним сле­ду­ют C# (10,5), Python (10,3), C++ (9,8), C (9,6), JavaScript (7,5), Visual Basic (3,8), Ruby (2,9) и Perl (1,9).

Java и Microsoft

Компанией Microsoft была разработана собственная реализация JVM (MSJVM), включавшаяся в состав различных ОС, начиная с Windows 95. MSJVM была близка к спецификации Sun Microsystems v.1.1.3, но не соответствовала ей по ряду принципиальных характеристик (в частности, по отсутствию поддержки технологий RMI и JNI и наличию нестандартных расширений). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более[5]. В настоящее время компанией Microsoft для платформы .NET предлагается Java-подобный язык J#, не соответствующий официальной спецификации языка Java.

20-летний юбилей Java

23 мая 2015 года исполнилось 20 лет от дня выхода первой версии Java.

В Oracle двадцатилетнюю годовщину со времени появления Java отметили шумным маркетинговым мероприятием[6].

Когда Java был представлен компанией Sun Microsystems, купленной Oracle в 2010 году, это была еще по большей части «доинтернетовская» эпоха, и мировой ландшафт ИТ сильно отличался от нынешнего. Тем не менее Java до сих пор остается в «ящике инструментов» разработчика, а многие другие языки, широко использовавшиеся в 1990-х, такие как Delphi или Perl, остались не у дел либо применяются лишь для ограниченного круга задач.

По мнению разработчиков Oracle платформы Java, главная ценность Java — удобочитаемость и простота.

На 23 мая 2015 года с Java вряд ли сравнится хоть один язык по широте применения в компьютерной индустрии. По оценкам Oracle, Java используют более 9 млн разработчиков и он используется в 7 млрд устройств. Java работает «двигателем», как в очень малых устройствах, так и в крупных системах облачных вычислений.

Google сделала Java основным языком написания программ для Android. На другом конце спектра — фреймворк Map/Reduce для платформы Hadoop, полагающийся на Java для обработки петабайтов данных. Программисты любят Java в том числе потому, что язык легко читается по сравнению с непроходимыми «дебрями», иной раз встречающимися в коде на C++ или Perl.

Удобочитаемость — очень ценная особенность для языка программирования, особенно используемого для разработки ПО уровня предприятия, пояснил он. Когда речь идет о сложной системе, программисту нужна возможность понимать код, который был написан месяцы или годы тому назад.

В пользу Java были и другие характеристики. Одна из них — выполнение разрекламированного в свое время слогана «написано однажды, работает везде». Поскольку код выполняется на кросс-платформенной виртуальной машине Java, можно написать программу на ноутбуке с Windows, а работать она может на сервере с Linux или Solaris без перекомпиляции.

В IDC считают, благодаря долгосрочному сохранению обратной совместимости, а также «методичному развитию» языка его популярность остается высокой. Использование Java в Android и грамотные действия Oracle определенно продлили жизнь платформы, обеспечив спрос на разработчиков с соответствующими навыками.

Oracle развивает язык, поддерживая его привлекательность. В планах корпорации, в релизе Java 9, готовящийся к сентябрю 2016 года, язык будет реорганизован и приведен к модульной архитектуре.

См. также

Ссылки

Литература

Примечания



ПРОЕКТЫ НА БАЗЕ (25) РЕШЕНИЕ НА БАЗЕ (9) СМ. ТАКЖЕ (450)
ОТРАСЛИ (6)

ЗаказчикИнтеграторГодЛицензий
- 3PL Logistic
InStock Technologies (Ин-Сток Текнолоджис)2016.09---
- Терминал 17
InStock Technologies (Ин-Сток Текнолоджис)2016.07---
- НС Трейд
InStock Technologies (Ин-Сток Текнолоджис)2016.06---
- Авто-Альянс, ГК
InStock Technologies (Ин-Сток Текнолоджис)2016.04---
- Ю-Трейд
InStock Technologies (Ин-Сток Текнолоджис)2016.04---
- Артель (Artel)
InStock Technologies (Ин-Сток Текнолоджис)2015.12---
- Санфлауэр-М
InStock Technologies (Ин-Сток Текнолоджис)2015.09---
- Юмикс
InStock Technologies (Ин-Сток Текнолоджис)2014.1210
- Меттэм технологии (тд Барьер и Аквасистемы, BWT Barrier)
InStock Technologies (Ин-Сток Текнолоджис)2014.09---
- Меркатор Калуга
InStock Technologies (Ин-Сток Текнолоджис)2014.0910
- Норман (фармацевтика)
InStock Technologies (Ин-Сток Текнолоджис)2014.0930
- JS Company
InStock Technologies (Ин-Сток Текнолоджис)2014.0210
- Санта-Бремор
Систем Групп Рус (SystemGroup)2013.1210
- Черная речка
InStock Technologies (Ин-Сток Текнолоджис)2013.1110
- Дверной Базар
InStock Technologies (Ин-Сток Текнолоджис)2013.1110
- Автохит ТД
InStock Technologies (Ин-Сток Текнолоджис)2013.0230
- Разумник
InStock Technologies (Ин-Сток Текнолоджис)2012.1170
- ГК Лама
InStock Technologies (Ин-Сток Текнолоджис)2012.1125
- Бесталко (ФМГ)
InStock Technologies (Ин-Сток Текнолоджис)2012.1130
- GT Logistics (GTL)
InStock Technologies (Ин-Сток Текнолоджис)2012.0915
- Супремо
Систем Групп Рус (SystemGroup)2012.0910
- RBLogistics (РБ лоджистикс)
InStock Technologies (Ин-Сток Текнолоджис)2012.0920
- Тотал Лоджистик Солюшнс (Total Logistic Solutions, ТЛС, TLS)
InStock Technologies (Ин-Сток Текнолоджис)2011.0920
- Сервисторг
InStock Technologies (Ин-Сток Текнолоджис)2010.1225
- Банана-Мама (Basis Group)
InStock Technologies (Ин-Сток Текнолоджис)2008.0930


Распределение вендоров по количеству проектов внедрений (систем, проектов) с учётом партнёров

За всю историю
2015 год
2016 год
2017 год
Текущий год

  Microsoft (61, 45)
  IBM (41, 19)
  Oracle (62, 16)
  Hyperledger (Open Ledger Project) (7, 13)
  Red Hat (17, 9)
  Другие (326, 91)

  Microsoft (2, 4)
  IBM (3, 3)
  Oracle (2, 3)
  Dassault Systemes (2, 3)
  PTC Inc (Parametric Technology Corporation ) (1, 2)
  Другие (9, 10)

  Oracle (2, 4)
  Red Hat (3, 3)
  Microsoft (2, 3)
  Ростелеком-Solar (ранее Solar Security, Солар Секьюрити) (1, 3)
  IBM (2, 2)
  Другие (9, 10)

  IBM (2, 2)
  Hyperledger (Open Ledger Project) (1, 2)
  Red Hat (1, 1)
  PTC Inc (Parametric Technology Corporation ) (1, 1)
  ISaGRAF Inc (1, 1)
  Другие (5, 5)

Распределение базовых систем по количеству проектов, включая партнерские решения

За всю историю
2015 год
2016 год
2017 год
Текущий год

  Windows Azure - 20 (20, 0)
  Hyperledger Fabric - 13 (13, 0)
  IBM Rational - 8 (5, 3)
  Microsoft.NET Framework - 8 (8, 0)
  Microsoft Visual Studio - 7 (3, 4)
  Другие 128

  Microsoft.NET Framework - 3 (3, 0)
  Target Zero Defect - 2 (2, 0)
  Jakarta EE (ранее Java EE) - 2 (2, 0)
  PTC ThingWorx - 2 (2, 0)
  Неолант InterBridge - 2 (2, 0)
  Другие 14

  Solar inCode - 3 (3, 0)
  Gemalto Ezio Mobile - 2 (2, 0)
  Microsoft.NET Framework - 2 (2, 0)
  Oracle Database Cloud Service - 2 (2, 0)
  Oracle Java as a Service - 2 (2, 0)
  Другие 13

  Hyperledger Fabric - 2 (2, 0)
  Spring - 1 (1, 0)
  ПТК Овация - 1 (1, 0)
  IBM API Connect - 1 (1, 0)
  IBM WebSphere Application Server (WAS) - 1 (1, 0)
  Другие 7