Java: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Java и Microsoft: Убрана про-MS стилистика статьи. В частности, чисто субъективное мнение об удобстве IDE
Строка 138: Строка 138:
== Java и Microsoft ==
== Java и Microsoft ==


Компанией [[Microsoft]] была разработана собственная реализация [[JVM]] ([[MSJava]] по имени главного исполняемого файла msjava.dll), включавшаяся в состав различных [[Операционная система|операционных систем]], начиная с [[Windows 98]] (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJava в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).
Компанией [[Microsoft]] была разработана собственная реализация [[JVM]] ([[MSJava]] по имени главного исполняемого файла msjava.dll), включавшаяся в состав различных [[Операционная система|операционных систем]], начиная с [[Windows 98]] (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJava в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).


MSJava два cущественных отличия от Sun Java, во многом ломающие переносимость программ между разными операционными системами:
Также Microsoft создала средство разработки Visual J++, абсолютно аналогичное Visual C++ и по некоторым отзывам существенно превосходившее инструменты от Sun по удобству разработки.


* отсутствие поддержки [[Интерфейс программирования приложений|программного интерфейса]] [[Remote Procedure Call|вызова удаленных методов]] ([[RMI]]). Взамен Microsoft предложила встроенные средства интеграции Java и [[DCOM]], работающие только на платформе Windows.
MSJava полностью поддерживала [[Sun Microsystems]] v.1.1.3, в Visual J++ была включена вся документация от Sun.
* отсутствие поддержки [[JNI]], замененной на иные средства, привязывающие программы к Windows


Тесная интеграция Java с DCOM и Win32 ломала многоплатформенную суть языка и являлась усилием Microsoft по поглощению технологии (см. [[Критика Microsoft]]). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более.<ref>{{cite web
MSJava имела только два отличия от Sun Java:

* отсутствие поддержки [[Интерфейс программирования приложений|программного интерфейса]] [[Remote Procedure Call|вызова удаленных методов]] ([[RMI]]). Взамен Microsoft предложила встроенные средства интеграции Java и [[DCOM]], причем со стороны серверного кода эта интеграция требовала абсолютный минимум усилий разработчика (интерфейсы Java автоматически становились интерфейсами DCOM).
* отсутствие поддержки [[JNI]], замененной на иные, но куда более богатые средства интеграции Java и [[Win32]].

С точки зрения Sun, тесная интеграция Java с DCOM и Win32 ломала многоплатформенную суть языка и являлась усилием Microsoft по поглощению технологии (см. [[Критика Microsoft]]). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более.<ref>{{cite web
| date = 12 сентября 2003
| date = 12 сентября 2003
| url = http://www.microsoft.com/mscorp/java/default.mspx
| url = http://www.microsoft.com/mscorp/java/default.mspx
Строка 157: Строка 153:
| lang = en
| lang = en
| description = Официальное заявление Microsoft о программе поддержки MSJVM
| description = Официальное заявление Microsoft о программе поддержки MSJVM
}}</ref>
}}</ref> В частности, MS прекратила включать MSJava в Windows и Internet Explorer.
В 2005 году компанией Microsoft для платформы [[.NET Framework|.NET]] был представлен Java-подобный язык [[Visual J Sharp|J#]], не соответствующий официальной спецификации языка Java.
В 2005 году компанией Microsoft для платформы [[.NET Framework|.NET]] был представлен Java-подобный язык [[Visual J Sharp|J#]], не соответствующий официальной спецификации языка Java.
С 2008 года этот язык был исключен из платформы [[.NET Framework|.NET]].
С 2008 года этот язык был исключен из платформы [[.NET Framework|.NET]].

Версия от 08:20, 9 октября 2010

Java
Файл:Java logo.png
Класс языка объектно-ориентированный, структурный, императивный
Появился в 1995
Автор Oracle Corporation (ранее Sun Microsystems)
Разработчик Sun Microsystems и Oracle[1]
Расширение файлов .java, .class, .jar, .jad или .jmod
Выпуск Java Standard Edition 6 (1.6.0_21) [2]
Система типов строгая полиморфная, статическая, безопасная, Шаблон:Translation, Шаблон:Translation
Основные реализации Шаблон:Translation
Диалекты Generic Java, Pizza
Испытал влияние Objective-C[3], Ада 83, Object Pascal[4], UCSD Pascal[5], C++, C#[6], Smalltalk, Eiffel[7], Mesa[8], Modula-3[9], Generic Java
Повлиял на Ада 2005, C#, Clojure, D, ECMAScript, Groovy, J#, VJ#, JavaScript, PHP, Scala, Python, BeanShell
Лицензия GNU General Public License / Java Community Process
Сайт oracle.com/technetwork/j…
Логотип Викисклада Медиафайлы на Викискладе

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems. Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) независимо от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.

Произношение, применение названия

В отношении произношения в русском языке, как и в ряде других, образовались две различные нормы[10] — заимствованная англоязычная /ˈdʒɑːvə/ («джава»)[11][12][13] и традиционно-национальная «ява», соответствующая традиционному произношению названия острова Ява. Компания Sun придерживается англоязычного произношения во всех странах мира. Иногда в обиходе используют также жаргонное слово «Жаба» (например, изображение жабы есть на календариках группы российских пользователей Java (Java Users Group).[14]

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

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

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

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

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

Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований:

  • применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
  • широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
  • аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее.[15] С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++.

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

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

Java 1.0

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

Java 1.2

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

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

Java 5

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

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

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

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

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

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

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

Java и Microsoft

Компанией Microsoft была разработана собственная реализация JVM (MSJava по имени главного исполняемого файла msjava.dll), включавшаяся в состав различных операционных систем, начиная с Windows 98 (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJava в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).

MSJava два cущественных отличия от Sun Java, во многом ломающие переносимость программ между разными операционными системами:

Тесная интеграция Java с DCOM и Win32 ломала многоплатформенную суть языка и являлась усилием Microsoft по поглощению технологии (см. Критика Microsoft). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более.[17] В 2005 году компанией Microsoft для платформы .NET был представлен Java-подобный язык J#, не соответствующий официальной спецификации языка Java. С 2008 года этот язык был исключен из платформы .NET.

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

Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: RuneScape, Amazon[18][19], eBay[20][21], Yandex (неоднозначная информация в отношении Java)[22][23], LinkedIn[24], Yahoo![25].

Следующие компании в основном фокусируются на Java (J2EE) технологиях: SAP, IBM, Oracle. В частности, СУБД Oracle включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры.[26]

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

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

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

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

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

Программа, выводящая «Hello, world!»:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Пример использования generics:

import java.util.*;
public class Sample {
    public static void main(String[] args) {
        // Создание объекта по шаблону.
        List<String> strings = new LinkedList<String>();
        strings.add("Hello");
        strings.add("world");
        strings.add("!");
        for (String s : strings) {
            System.out.print(s);
            System.out.print(" ");
        }
    }
}

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

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

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

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte. Типы float и double могут иметь специальные значения , и «не число» (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, а также , , NaN
double 8 -(2-2−52)·21023..(2-2−52)·21023, или примерно −1.8·10308..1.8·10308, а также , , NaN

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

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

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

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

Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в C++.[27]

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

В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, в Java нельзя писать:

double a[10][20];
Foo b(30);

а нужно:

double[][] a = new double[10][20];
Foo b = new Foo(30);

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

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

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

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

Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов: Boolean, Byte, Character, Short, Integer, Long, Float, Double.

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

Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать

Foo foo, bar;

bar = foo;

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

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

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

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

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

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

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

В Java (как и в C++) используются статические методы (англ. static method), которые задаются при помощи ключевого слова static. Статические поля имеют тот же смысл, что и в C++: каждое такое поле является собственностью класса, поэтому для доступа к статическим полям не требуется создавать экземпляры соответствующего класса.

Например, математические функции, реализованные в классе Math, представляют собой, как раз, статические методы данного класса. Поэтому можно писать

double x = Math.sin(1);

вместо

Math m = new Math();
double x = m.sin(1);

Поскольку статические методы существуют независимо от объектов (экземпляров класса), они не имеют доступа к обычным (нестатическим) полям и методам данного класса. В частности, при реализации статического метода недопустимо использовать идентификатор this.

Завершённость (final)

Ключевое слово 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++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.

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

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

Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <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() всегда вернёт true.

В паре с упомянутыми функциями объекта типа Class используются также функции isInstance() (эквивалентно instanceof), а также cast() (преобразует параметр в объект выбранного класса).

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

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

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

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

См. также

Примечания

  1. 1 2 https://www.oracle.com/java/
  2. Java SE 6 Update 21 Release Notes (англ.). Oracle Corporation.
  3. Java Was Strongly Influenced by Objective-C
  4. White Paper. About Microsoft’s «Delegates» Официальный сайт
  5. History of Java in Java Application Servers Report TechMetrix Research, 1999
  6. В Java 5.0 было добавлено несколько новых особенностей (foreach, autoboxing, varargs и аннотаций), после того, как они были введены в аналогичный (и конкурирующий) язык C#; см.: http://www.barrycornelius.com/papers/java5/ http://www.levenez.com/lang/
  7. Gosling, McGilton. The Java Language Environment. Официальный сайт (май 1996). Дата обращения: ???.
  8. J. Gosling, B. Joy, G. Steele, G. Brachda. The Java Language Specification, 2nd Edition. Официальный сайт. Дата обращения: ???.
  9. The A-Z of Programming Languages: Modula-3 — a-z of programming languages — Computerworld
  10. Java. Яндекс.Словари. Дата обращения: 6 сентября 2009.
  11. java (англ.). Merriam-Webster Online Dictionary. Merriam-Webster. — Английская норма произношения слова «Java», с приложением аудиофайлов. Дата обращения: 5 июня 2009.
  12. java. Компьютерный словарь ABBYY Lingvo. ABBYY Ligvo. — Перевод названия платформы вместе с указанием произношения. Дата обращения: 24 июля 2009.
  13. java. Глоссарий технической терминологии для журналистики и коммуникаций. WebMedia Group (4 февраля 2009). Дата обращения: 24 июля 2009.
  14. Календарики на 2009 год. Java Users Group. Дата обращения: 6 сентября 2009.
  15. Java 6 -server speed ÷ C++ GNU g++ speed | Computer Language Benchmarks Game
  16. Robert Tolksdorf. Programming languages for the Java Virtual Machine JVM (англ.). is-research GmbH. — Онлайн-каталог альтернативных языков и языковых расширений для JVM. Дата обращения: 5 июня 2009.
  17. Microsoft Java Virtual Machine Support (англ.). Microsoft (12 сентября 2003). — Официальное заявление Microsoft о программе поддержки MSJVM. Дата обращения: 5 июня 2009.
  18. Todd Hoff. Amazon Architecture (англ.) (18 сентября 2007). — Обсуждение архитектуры Amazon с использованием Java-технологий. Дата обращения: 6 июня 2009.
  19. Amazon Elastic Compute Cloud (Amazon EC2) (англ.). Amazon Web Services LLC. — Описание технологии и возможностей Amazon EC2 как веб-сервиса. Дата обращения: 6 июня 2009.
  20. Todd Hoff. eBay Architecture (англ.) (27 мая 2008). — Обсуждение архитектуры eBay на платформе Java. Дата обращения: 6 сентября 2009.
  21. Randy Shoup, Dan Pritchett. The eBay Architecture (англ.). SD Forum 2006. ??? (29 ноября 2006). — Презентация по истории развития архитектуры eBay. Дата обращения: 6 июня 2009.
  22. Allen Stern. Exclusive Interview With Yandex CTO Ilya Segalovich (англ.). CenterNetworks (14 января 2008). — Интервью с техническим директором Яндекса Ильёй Сегаловичем. Дата обращения: 6 июня 2009.
  23. Анатолий Орлов. Архитектура Яндекс.Поиска (PowerPoint). Материалы встречи JUG в Екатеринбурге. ??? (24 мая 2008). Дата обращения: 6 июня 2009.
  24. Brian Guan. The LinkedIn Blog. Blog Archive. Grails at LinkedIn (англ.). LinkedIn.com (11 июня 2008). — История создания системы LinkedIn на основе Java-технологии Grails. Дата обращения: 5 июня 2009.
  25. Hadoop and Distributed Computing at Yahoo! (англ.). Yahoo!. — Стартовая страница Java-технологии распределённого обслуживания Hadoop на портале разработчиков Yahoo! Дата обращения: 21 июня 2009.
  26. OracleJVM and Java Stored Procedures (англ.). Oracle Inc.. — Раздел портала Oracle, посвящённый технологиям Java в составе сервера СУБД Oracle. Дата обращения: 5 июня 2009.
  27. Бьярн Страуструп. Язык программирования С++ = The C++ Programming Language. — М.—СПб.: Бином, Невский диалект, 2008. — 1104 с. — 5000 экз. — ISBN 5-7989-0226-2; ISBN 5-7940-0064-3; ISBN 0-201-70073-5.
  28. Object (Java 2 Platform SE v1.4.2) (англ.). Sun Microsystems. — Ссылка на документацию к методу Object.clone(). Дата обращения: 6 сентября 2009.

Литература

Ссылки

Шаблон:Link FA Шаблон:Link GA