Java
Материал из Википедии — свободной энциклопедии
Семантика: | {{{semantics}}} |
---|---|
Класс языка: | объектно-ориентированный |
Тип исполнения: | {{{class}}} |
Появился в: | начало 1990-х г. |
Автор(ы): | Sun Microsystems |
Последняя версия: | {{{latest_release_version}}} |
Тестовая версия: | {{{latest_test_version}}} |
Типизация данных: | строгая, статическая |
Основные реализации: | |
Диалекты: | |
Создан под влиянием: | Objective-C, C++, Smalltalk |
Оказал влияние на: | C#, J#, VJ# |
Java (произносится /ˈdʒɑːvə/) — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Многие люди, говоря на русском, называют язык «Ява» по аналогии с географическим названием.
Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе Ява (Java), любимого программистами, поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.
Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) — программе, обрабатывающей байтовый код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байтовый код в отличие от текста обрабатывается значительно быстрее.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности, благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.
Часто к недостаткам этого подхода относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии JIT (Just-In-Time compilation), позволяющей переводить байт-код в машинный код во время исполнения программы с возможностью сохранения версий класса в машинном коде, широкое использование native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Внутри 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. Здесь Java действительно держит мировое лидерство.
Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки XML и скриптового языка Mozilla Rhino, улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Прежняя версия JVM от Microsoft (аналог SUN JVM v.1.1.3) во многом отступает от стандартов языка, предложенных Sun Microsystems, с целью проприетарной поддержки платформы Windows. Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В настоящее время между двумя компаниями достигнуты договорённости вплоть до снятия взаимных судебных претензий и произведено взаимное кросс-лицензирование технологий. По версии Microsoft будет поддерживаться спецификация MS-J# соответствующая спецификации SUN-JVM J2SE.
Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: Amazon, eBay, Flickr, Google (Gmail), Yandex, LinkedIn.
Следующие компании в основном фокусируются на Java (J2EE) технологиях, а не на .NET, хотя имеют дело также и с последними: SAP, IBM, Oracle.
Содержание |
[править] Основные возможности
- расширенные возможности обработки исключительных ситуаций;
- богатый набор средств фильтрации ввода/вывода;
- набор стандартных коллекций, таких как массив, список, стек и т. п.;
- наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI);
- наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
- встроенные в язык средства создания многопоточных приложений;
- унифицированный доступ к базам данных на основе JDBC и SQLJ.
- поддержка шаблонов (начиная с версии 1.5)
[править] Пример программы
Программа, выводящая «Hello, World!»:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
Пример использования шаблонов:
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. В отличие от C++, в Java нет ни беззнаковых типов, ни типов вроде long double, наличие или отсутствие которых определяется реализацией.
Длины и диапазоны значений предопределённых типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte. Типы float и double могут иметь специальные значения , и «не число». Для типа 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 действуют следующие правила:
- Если один операнд имеет тип double, другой тоже преобразуется к типу double.
- Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
- Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
- Иначе оба операнда преобразуется к типу int.
Последнее правило отличает Java от C и C++ и делает код более безопасным. Так, например, в языке Java после выполнения кода
short x=50, y=1000; int z=x*y;
z присваивается значение 50000, а не −15536, как в большинстве реализаций C и C++.
[править] Объектные переменные, объекты, ссылки и указатели
В языке 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).
[править] Дублирование ссылок и клонирование
Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать
Foo foo, bar;
…
bar=foo
то произойдет копирование адреса из переменной foo в переменную bar. То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo, будет менять объект, с которым связана переменная bar, и наоборот. Для решения этой проблемы пользуются или методом (функцией-членом, в терминологии C++) clone, создающим копию объекта, или же копирующим конструктором.
Метод clone требует, чтобы класс реализовывал интерфейс Cloneable (об интерфейсах см. ниже). Если класс реализует интерфейс Cloneable, по умолчанию clone копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone. Определение и использование метода clone часто является нетривиальной задачей [1].
[править] Сборка мусора
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на освобождение памяти, является присваивание переменной пустого значения null
. Это, однако, не значит, что переменная установленная в null
будет непременно удалена. Данный прием всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать тот факт, что объект не будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.
[править] Классы и функции
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» (member function), а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin, а есть метод Math.sin класса Math (содержащего, кроме sin, методы cos, exp, sqrt, abs и многие другие).
[править] Статические методы и поля
Для того чтобы не надо было создавать объект класса Math (и других аналогичных классов) каждый раз, когда надо вызвать sin (и другие подобные функции), введено понятие статических методов (static method; иногда в русском языке они называются статичными). Статический метод (отмечаемый словом static в описании) можно вызвать, не создавая объекта его класса. Поэтому можно писать
double x = Math.sin(1);
вместо
Math m = new Math(); double x = m.sin(1);
Ограничение, накладываемое на статические методы, заключается в том, что в объекте this они могут обращаться только к статическим полям и методам.
Статические поля имеют тот же смысл, что и в C++: каждое существует только в одном экземпляре.
[править] Финальность
Слово final (финальный) означает разные вещи при описании переменной, метода или класса. Финальная переменная инициализируется при описании и дальше не может быть изменена. Финальный метод не может быть переопределён при наследовании. Финальный класс не может иметь наследников вообще.
[править] Абстрактность
В Java все методы являются виртуальными в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.
Абстрактным методом (описатель abstract) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не тело. Абстрактный метод определяется в классах-наследниках. В C++ то же самое называется чисто виртуальной функцией. Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя.
[править] Интерфейсы
Высшей степенью абстрактности в Java является интерфейс (interface). Все методы интерфейса абстрактны: описатель abstract даже не требуется. Интерфейс не является классом. Класс может наследовать, или расширять (extends) другой класс или реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или расширять, другой интерфейс.
В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов.
Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их типов.
[править] Проверка принадлежности к классу
В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).
Далее, функция getClass(), определённая для всех объектов, выдаёт объект типа Class. Эти объекты можно сравнивать. Так, например, foo.getClass()==bar.getClass() будет истинно, если foo и bar принадлежат в точности к одному объекту, так как они фактически при этом в данном выражении будут являться указателями и ссылающимися на один и тот же объект.
[править] Библиотеки классов
- JDK — содержит набор базовых классов для всего ПО на платформах Java SE и Java EE
- CDK — для создания химического ПО
- MARF — модульная библиотека для распознавания аудио
[править] Средства разработки ПО
- JDK — помимо набора библиотек для платформ 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.
[править] См. также
- Сравнение C# и Java
- Сравнение возможностей Java с другими языками см. в статье Сравнение языков программирования
[править] Ссылки
- Java в DMOZ
- Официальный сайт Java, поддерживаемый Sun
- ru.sun.com — Ресурсы и документации по Java на русском от SUN
- Bruce Eckel’s Free Electronic Books(англ.) — свободно распространяемые электронные версии книг Брюса Эккеля по C++ и Java вместе с исходным кодом
- Статьи о SOA и Java
- http://bruceeckel.by.ru — переводы на русский язык некоторых свободно распространяемых книг Брюса Эккеля по Java
- Canadian Mind Products Java & Internet Glossary — понятно о базовых аспектах Java-технологий
- c2p.ru — Статьи и книги по программированию на языке Java
- Все о технологии Java
- Русский сайт о Java: библиотека, форумы, каталог ссылок и т. д.
- Сайт сообщества пользователей Java (Java User Group): встречи пользователей, новости
- Сообщество Java-разработчиков КПИ: wiki, форум, новости, глоссарий
- Белорусская Java User Group — новости, встречи сообщества, доклады ведущих специалистов, обмен опытом
- TheServerSide: Enterprise Java Community — ServerSide News, Books, Discussions & Reviews
- Блог о технологиях Java на русском языке
[править] Литература
- Монахов Вадим Язык программирования Java и среда NetBeans. — СПб.: «БХВ-Петербург», 2008. — С. 627. — ISBN 978-5-9775-0216-0
- Джошуа Блох. Java. Эффективное программирование = Effective Java. — М.: «Лори», 2002. — С. 224. — ISBN 5-85582-169-2
- Кей С. Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала, том 1. Основы = Core Java™ 2, Volume I--Fundamentals. — 7-е изд. — М.: «Вильямс», 2007. — С. 896. — ISBN 0-13-148202-5
- Кей С. Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала, том 2. Тонкости программирования = Core Java™ 2, Volume II--Advanced Features. — 7-е изд. — М.: «Вильямс», 2007. — С. 1168. — ISBN 0-13-111826-9
- Брюс Эккель. Философия Java = Thinking in Java. — 3-е изд.. — СПб.: «Питер», 2003. — С. 976. — ISBN 5-88782-105-1
- Герберт Шилдт, Джеймс Холмс. Искусство программирования на Java = The Art of Java. — М.: «Диалектика», 2005. — С. 336. — ISBN 0-07-222971-3
- Любош Бруга. Java по-быстрому: Практический экспресс-курс = Luboš Brůha. Java Hotová řešení.. — М.: Наука и техника, 2006. — С. 369. — ISBN 5-94387-282-5
|
|
---|---|
Используемые в разработке | ABAP/4 | Ада | ActionScript | Ассемблеры | AutoIt | Awk | BASIC | C | COBOL | C++ | C# | ColdFusion | D | Delphi | Erlang | Eiffel | Forth | FoxPro | DataFlex | Фортран | Groovy | Haskell | Java | JavaScript | J++ | J# | Icon | Limbo | Лисп | Lua | Objective-C | Оберон | Oz | Паскаль | Perl | PHP | PL/I | Пролог | Руби | Python | Tcl | Scheme | Smalltalk | SQL | Vala | Visual DataFlex | Visual Basic | VB.NET | Visual FoxPro |
Академические | АПЛ | Clean | Curry | Лого | MATLAB | ML | Scala |
IEC61131-3 | Instruction List | ST | FBD | Ladder Diagram | SFC |
Прочие | Алгол | Алгол 68 | Модула-2 | Miranda | Hope |
Эзотерические | INTERCAL | Brainfuck | Befunge | Malbolge | Unlambda |
список всех языков |