Класс языка: |
объектно-ориентированный |
---|---|
Появился в: |
начало 1990-х г. |
Автор(ы): |
Sun Microsystems |
Типизация данных: |
строгая полиморфная, статическая |
Предки: |
Objective-C, C++, Smalltalk |
Потомки: |
Groovy, C#, J#, VJ# |
Java (произносится /ˈdʒɑːvə/) — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Многие люди, говоря на русском, называют язык «Ява» по аналогии с географическим названием.
Он относится к семейству смешанных языков. Позволяет использовать несколько стилей программирование Си и при этом перенял множество его недостатков. Язык Java подразумевает, что мы занимаемся только ООП. Кроме того считается, что по простоте и изучению и разработке Java превосходит многие языки. 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 существуют три основных семейства технологий:
- 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, а также добавлена поддержка скриптового языка JavaScript на основе механизма Mozilla Rhino (англ.), улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Java и Microsoft
Компанией Microsoft была разработана собственная реализация JVM (MSJVM), включавшаяся в состав различных ОС, начиная с Windows 95. MSJVM была близка к спецификации Sun Microsystems v.1.1.3, но не соответствовала ей по ряду принципиальных характеристик (в частности, по отсутствию поддержки технологий RMI и JNI и наличию нестандартных расширений). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более[2]. В настоящее время компанией Microsoft для платформы .NET предлагается Java-подобный язык J#, не соответствующий официальной спецификации языка Java.
Применения платформы Java
Следующие успешные проекты реализованы с привлечением 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.
Длины и диапазоны значений предопределённых типов определяются стандартом, а не реализацией и приведены в таблице. Тип 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, а также
, |
double | 8 | -(2-2-52)·21023..(2-2-52)·21023, или примерно −1.8·10308..1.8·10308, а также
, |
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к 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++. В программе, скомпилированной MS VC++, начиная с версии 7, а также многими другими современными компиляторами (gcc, Intel C++, Borland C++, Comeau и т.д.), значение будет так же равно 50000, так что к достоинствам Java этот пример отнести нельзя.
Объектные переменные, объекты, ссылки и указатели
В языке 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
в описании) можно вызвать, не создавая объекта его класса. Поэтому можно писать
вместо
Math m = new Math(); double x = m.sin(1);
Ограничение, накладываемое на статические методы, заключается в том, что в объекте this
они могут обращаться только к статическим полям и методам.
Статические поля имеют тот же смысл, что и в C++: каждое существует только в единственном экземпляре.
Финальность
Ключевое слово final
(финальный) означает разные вещи при описании переменной, метода или класса. Финальная переменная инициализируется при описании и дальше не может быть изменена. Финальный метод не может быть переопределён при наследовании. Финальный класс не может иметь наследников вообще.
Абстрактность
В Java методы, не объявленные явно как final
или private
, являются виртуальными в терминологии 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.
Генерированная реализация шаблона посетителя в Java
Платформа должна предоставлять возможность использовать разную логику преобразования (то есть разные преобразователи) для одной и той же пары источника и результата. Он также должен быть расширяемым, то есть позволять добавлять новые конвертеры для новых и существующих пар источника и результата. Еще одно требование — безопасность типов, то есть любая попытка преобразовать экземпляр некоторого исходного класса в экземпляр класса результата без преобразователя, реализующего соответствующую логику преобразования, должна привести к ошибке времени компиляции.[3]
Покерные программы
Есть различные типы программ для покера, одни имитируют игру человека, другие призваны помогать человеку во время игры. Создано достаточно много различных программ, которые помогают игрокам при игре онлайн. Есть как любительские программы, так и профессиональные.[4]
Примечания
- ↑ Онлайн-каталог альтернативных языков и языковых расширений для JVM
- ↑ Официальное заявление Microsoft о программе поддержки MSJVM
- ↑ Генерированная реализация шаблона посетителя в Java.
- ↑ Приложения по карточным играм.
См. также
- Сравнение C# и Java
- Сравнение возможностей Java с другими языками см. в статье Сравнение языков программирования
Ссылки
- Java в DMOZ
- Официальный сайт Java, поддерживаемый Sun
- ru.sun.com — Ресурсы и документации по Java на русском от SUN
- Программирование на языке Java. 27 обучающих уроков
- developers.sun.ru — Российский портал разработчиков на русском от Sun Microsystems
- 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
Шаблон:Java
п·о·р Основные языки программирования |
|
---|---|
Используемые в разработке |
ABAP/4 • |
Академические |
АПЛ • |
IEC61131-3 |
Instruction List • |
Прочие |
Алгол • |
Эзотерические |
INTERCAL • |
Cписок всех языков |
Эта страница использует содержимое раздела Википедии на русском языке. Оригинальная статья находится по адресу: Java. Список первоначальных авторов статьи можно посмотреть в истории правок. Эта статья так же, как и статья, размещённая в Википедии, доступна на условиях CC-BY-SA .
👉 В этом разделе мы на примерах разбираем сложные айтишные термины. Если вы хотите почитать вдохновляющие и честные истории о карьере в IT, переходите в другие разделы.
Java — это строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems.
Что такое Java
При ответе на вопрос: «Что этакое Java» в первую очередь отмечаем, что Java — это язык программирования, на котором в настоящий момент функционирует множество известных приложений, программ и большинство ОС для современных смартфонов.
Это один из наиболее известных и популярных языков, который используют во многих компаниях, в том числе в Netflix, AliExpress, Google, Intel, eBay, TripAdvisor и многих других. С момента появления в 1995 году он только набирал популярность, став лидером к концу 2010-х наряду с Python. В рейтинге TIOBE за июль 2022 года Java занимает третье место.
Что можно написать на Java
Написать на языке можно практически все что угодно:
- приложения для Android (Java — почти единственный язык для их разработки);
- промышленные программы;
- десктопные приложения;
- банковские программы;
- программы для работы с Big Data;
- научные программы;
- корпоративный софт;
- веб-сервера, веб-приложения, сервера приложений;
- встроенные системы — от небольших чипов до специальных компьютеров.
Фреймворки позволяют создавать на Java практически любые приложения: от небольших проектов электронной коммерции до крупных порталов и правительственных системных инструментов. Если говорить о серверных приложениях, то на Java может быть создано не только отдельное приложение, но и вся серверная часть проекта. На Java пишут программы для научно-исследовательской деятельности и клиентские приложения.
Не так часто, но все же на Java создаются и игры. Ряд популярных компьютерных игр — например, GodofWars создана на нем.
Java ценится за безопасность, поэтому язык чаще других выбирается для создания программных продуктов, где необходима надежность: терминалы банков, сервисы управления авиаперелетами, системные решения по обработке финансовых транзакций и пр. Еще одна причина широкого применения в сфере промышленной разработки — язык экономичен в обслуживании. Работать с программными решениями, реализованными на нем можно с любого ПК, нет зависимости от отдельно взятой аппаратной инфраструктуры.
Свойства Java
Java — мультифункциональный объектно-ориентированный язык со строгой типизацией.
Мультифункциональность. Java не привязан ни к одной из популярных платформ. С одинаковым успехом его можно использовать на Windows или iOS, Linux или Android.
Строгая (сильная) типизация. Она не позволяет смешивать в выражениях различные типы и не выполняет автоматически неявные преобразования.
Объектно-ориентированность. Java создан по модели объектно-ориентированного программирования. Здесь есть классы и объекты. Классы — типы данных, а объекты — представители классов. Разработчик создает их сам, дает названия и присваивает им свойства и операции, которые можно выполнять с ними. Это напоминает конструктор, позволяющий построить то, что хочется.
Преимущества и недостатки Java
У Java, как и у любого другого языка программирования, есть ряд плюсов и минусов, которые и определяют его приверженцев.
К плюсам можно отнести:
- мультифункциональность;
- достаточно простой синтаксис;
- независимость (код сможет работать на любой платформе, поддерживающей Java);
- надежность (благодаря строгой статической типизации);
- возможность параллельной разработки;
- хорошую организацию кода и его легкую поддержку;
- универсальность использования различных классов.
К недостаткам относятся:
- требуемое большое количество памяти;
- низкая скорость по сравнению с С и С++;
- отсутствие поддержки низкоуровневого программирования;
- платные с 2019 года обновления для бизнеса и коммерческого использования.
Автоматическая сборка мусора (garbage collection) — спорный пункт. С одной стороны, это плюс, но с другой стороны, когда разработчик не может контролировать процесс, это минус.
Чем Java отличается от JavaScript
Зачастую пользователи путают два этих термина, считая их аналогичными или тождественными. Однако Java и JavaScript — это два принципиально разных инструмента. Похожие названия — просто случайность и одно из самых главных сходств, гораздо больше между ними различий.
JavaScript применяется только для управления интернет-страницами. Проще говоря — JavaScript используется только для сценариев, связанных с браузером. Анимация веб-страниц, браузерные игры, регистрация журнала пользователей, всплывающая реклама — все, что обновляется на сайте без перезагрузки страницы выполняется через JavaScript.
На JavaScript теоретически можно писать приложения и даже десктопное ПО, но это сложно и нецелесообразно.
Чем Java отличается от Python и C
Когда говорят о конкурентах Java, в первую очередь вспоминают Python. Языки соревнуются много лет, постоянно опережая друг друга в рейтингах. Но различия все же есть.
Типизация
У Java она статическая — при вводе переменной необходимо прописывать тип данных. У Python — динамическая: типы данных определяются автоматически. Кроме того, в Python можно смешивать разные типы переменных.
Читаемость
Это отличие связано с предыдущим, потому что то же указание типов оказывает влияние на конечный вид кода. У Java простой синтаксис по сравнению с другими языками, но у Python — еще проще.
Пример кода в Python:
Пример кода на Java:
Источник
У синтаксиса в Python ясная простая структура, его можно даже назвать интуитивным. Язык подойдет новичкам.
Код в Java более комплексный, со множеством знаков и слов: на английском подобный синтаксис называют verbose, то есть многословный код. Он сложнее читается и может вызвать трудности у новичков, хотя многие разработчики чувствуют себя более комфортно со строгим синтаксисом.
Скорость
Python отстает от Java по производительности и скорости. В обоих языках приложения переводятся в байт-код (чтобы быть кроссплатформенными), но различия — в том, когда это происходит. Java компилирует с помощью JIT-компиляции, заранее, а Python — при выполнении программы. Поэтому Java намного быстрее.
Чем Java отличается от C#
Второй возможный конкурент Java — язык программирования C#. У них есть явное сходство: они оба объектно-ориентированные со статической типизацией. Кроме того, имеют похожий синтаксис. Разберем отличия.
Безопасность
Один из важных параметров языков программирования — типобезопасность (безопасность системы типов). В безопасном языке после проверки согласования типов в них не возникнет ошибок во время выполнения.
Ни С#, ни Java не считаются типобезопасными языками, но Java достаточно надежный и разрабатывался так, чтобы не было ошибок в этой области. В C# имеются указатели, и из-за такого доступа к памяти он менее безопасный.
Указатели и управление памятью
Если вам нужны указатели (например, хочется работать с памятью на более низком уровне), желательно выбирать другие языки, например С, С++. Но в C#, в отличие от Java, указатели есть, пусть и ограниченные.
Поддержка платформ
C# разрабатывался непосредственно для экосистемы Microsoft. На нем создается ПО специально для Windows. Java более универсален. На Java можно написать приложения и для Microsoft в том числе. Это делает его применение более широким. При этом C# прекрасно подходит для разработки игр и проектов виртуальной реальности.
Может ли новичок изучить Java
Java легче многих других языков, например С и С++. При изучении Java вам не потребуется осваивать управление памятью. Но, как мы уже говорили, у Python проще синтаксис и свободнее типизация.
Если вы совсем новичок, изучать Java может быть достаточно сложно и можно выбрать языки с более простым синтаксисом. Но если имеется минимальный опыт программирования, то Java — отличный выбор. Он позволит освоить программирование, не тратя время на работу с памятью, а также погрузиться в объектно-ориентированное программирование, которое упрощает работу.
Означает ли это, что не нужно пробовать без опыта? Вовсе нет. Если есть желание работать именно с Java, то вполне реально разобраться в ней с нуля.
Для Java характерна мощная поддержка международного сообщества разработчиков, поэтому новичок, столкнувшись с вопросом, наверняка сможет найти помощь у специалистов. Десятки специализированных форумов и сообществ в социальных сетях помогают начинающим разработчикам в режиме онлайн. Если вы решили начинать учиться писать код на Java, один на один с проблемами точно не останетесь. Кроме того, постоянно выпускаются новые библиотеки и инструменты. Регулярно появляются новые современные решения, основанные на Java Virtual Machine. При этом большинство реализаций являются бесплатными и доступными для всех без исключения.
Насколько востребован язык Java
На HeadHunter по запросу «программист java» можно найти свыше 2000 вакансий по всей России. Известный ресурс «Хабр Карьера» предлагает более 1000 вакансий. Эти данные совсем свежие, август 2022 года. Разброс в заработной плате довольно большой и обусловлен уровнем программиста. Junior может найти заработок около 60 тыс. рублей. Senior — от 300 тысяч и выше. Важный плюс: практически все вакансии предполагают удаленную работу.
Немаловажным плюсом является возможность разработок под Android, которая, судя по всему, еще долго продолжит оставаться самой крупной мобильной операционной системой.
Java — достаточно доступный язык для знакомства с программированием и повышения собственных скиллов. Это популярный мультифункциональный язык, востребованный везде. Ключевое преимущество Java — безграничная возможность для работы с приложениями на платформе Android. Сообщество пользователей Java невероятно широко и в любой момент готово прийти на помощь. Программное обеспечение платформы Java стабильно и регулярно обновляется.
Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания апплетов, приложений и серверного программного обеспечения.
Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) — программе, обрабатывающей байт-код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байт-код, в отличие от текста, обрабатывается значительно быстрее.
Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке C++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента — языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.
Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с C и C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++.
Три ключевых элемента объединились в технологии языка Java
- Java предоставляет для широкого использования свои апплеты (applets) — небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML
- Java высвобождает мощь объектно-ориентированной разработки приложений, сочетая простой и знакомый синтаксис с надежной и удобной в работе средой разработки. Это позволяет широкому кругу программистов быстро создавать новые программы и новые апплеты
- Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов
Примеры:
Hello, World!:
Пример для версий
Groovy 1.7,
Sun Java 6,
gcj 3.4.5
Для Java приведенный код должен находиться в файле HelloWorld.java.
public class HelloWorld {
public static void main(String[] args)
{
System.out.println("Hello, World!");
}
}
Факториал:
Пример для версий
Groovy 1.7,
Sun Java 6,
gcj 3.4.5
Используется рекурсивное определение факториала. Для хранения больших чисел использован элементарный тип данных long
, позволяющий хранить числа от -263 до 263-1.
public class Factorial {
static long factorial(int n)
{
return ( n==0 ? 1 : n*factorial(n-1) );
}
public static void main(String[] args)
{
for (int n=0; n<=16; n++)
System.out.println(n+"! = "+factorial(n));
}
}
Числа Фибоначчи:
Пример для версий
Groovy 1.7,
Sun Java 6,
gcj 3.4.5
Используется рекурсивное определение чисел Фибоначчи.
public class Fibonacci {
static int fibonacci(int n)
{
return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
}
public static void main(String[] args)
{
for (int n=1; n<=16; n++)
System.out.print(fibonacci(n)+", ");
System.out.println("...");
}
}
Факториал:
Пример для версий
Groovy 1.7,
Sun Java 6,
gcj 3.4.5
Используется итеративное вычисление факториала. Для хранения больших чисел используется встроенный класс BigInteger
, позволяющий обрабатывать сколь угодно большие числа ценой увеличения времени обработки.
import java.math.BigInteger;
public class Factorial {
public static void main(String[] args)
{
BigInteger f = new BigInteger("1");
System.out.println("0! = " + f.toString());
for (int n=1; n<=16; n++)
{ f = f.multiply(new BigInteger(""+n));
System.out.println( n + "! = " + f.toString());
}
}
}
Квадратное уравнение:
Пример для версий
Groovy 1.7,
Sun Java 6,
gcj 3.4.5
В Java нет типа данных для работы с комплексными числами, поэтому вычисления производятся в дробных числах и выполняется отдельная проверка на знак дискриминанта. Реализация позволяет решать квадратные уравнения не только с целыми, но и с дробными коэффициентами.
Коэффициенты читаются из потока System.in
. Напрямую из него можно читать только отдельные байты, поэтому для повышения комфортности чтения используются классы InputStreamReader
и BufferedReader
. Строки, прочитанные из System.in
, преобразуются в числа типа double с помощью метода Double.parseDouble(). Все операции ввода в Java должны находиться внутри блоков try ... catch
, чтобы гарантированно обрабатывать IOException
— класс исключений, порождаемых функциями чтения.
import java.util.*;
import java.io.*;
public class Quadratic {
static String print(double real, double imag)
{ if (Math.abs(imag)<1E-6)
return ""+real;
else
return "("+real+","+imag+")";
}
public static void main(String[] args)
{ double A,B,C,D;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("A = ");
A = Double.parseDouble(br.readLine());
if (Math.abs(A)<1E-3)
{ System.out.println("Not a quadratic equation.");
return;
}
System.out.print("B = ");
B = Double.parseDouble(br.readLine());
System.out.print("C = ");
C = Double.parseDouble(br.readLine());
}
catch (Exception e) {
System.err.println("An error occured while reading input parameters.");
return;
}
A = 2*A;
D = B*B-2*A*C;
if (Math.abs(D)<1E-3)
{ System.out.println("x = "+(-B/A));
return;
}
if (D>0)
System.out.println("x1 = "+print((-B+Math.sqrt(D))/A, 0)+"nx2 = "+print((-B-Math.sqrt(D))/A, 0));
else
System.out.println("x1 = "+print(-B/A,Math.sqrt(-D)/A)+"nx2 = "+print(-B/A,-Math.sqrt(-D)/A));
}
}
CamelCase:
Пример для версий
Groovy 1.7,
Sun Java 6
В этом примере используются регулярные выражения Java. Регулярное выражение [a-zA-Z]+
описывает последовательность букв латинского алфавита в любом регистре, идущих подряд, окруженную другими символами или концами строки. Пара классов Pattern
и Matcher
позволяют создать это регулярное выражение и извлечь из строки все фрагменты, соответствующие ему. Для каждого такого фрагмента его первый символ переводится в верхний регистр, а последующие — в нижний, с использованием стандартных методов класса String
. Наконец, результаты обработки фрагмента записываются в переменную типа StringBuffer
, накапливающую результат.
import java.util.regex.*;
import java.io.*;
public class CamelCase {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Pattern p = Pattern.compile("[a-zA-Z]+");
Matcher m = p.matcher(br.readLine());
StringBuffer result = new StringBuffer();
String word;
while (m.find()) {
word = m.group();
result.append(word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase());
}
System.out.println(result.toString());
} catch (Exception e) {
System.err.println("An error occured while reading input string.");
}
}
}
Java — объектно-ориентированный язык программирования, выпущенный компанией Sun Microsystems в 1995 году как основной компонент платформы Java. Сейчас языком занимается компания Oracle, которая приобрела Sun Microsystems в 2009 году. Синтаксис языка во многом похож на C и C++. В официальной реализации, Java приложения компилируются в байт-код, который при выполнении интерпретируется виртуальной машиной для конкретной платформы.
Oracle предоставляет компилятор Java и виртуальную машину Java, которые удовлетворяют спецификации Java Community Process, под лицензией GNU General Public License.
Язык значительно позаимствовал синтаксис с C и C++. В частности, взята за основу объектная модель С++, однако ее модифицировали. Устранена возможность появления некоторых конфликтных ситуаций, которые могли возникнуть из-за ошибки программиста. Ряд действий, которые в С/C++ должны осуществлять программисты, поручены виртуальной машине. Прежде, Java разрабатывалась как платформо-независимый язык, поэтому она имеет меньше низкоуровневых возможностей для работы с аппаратным обеспечением. При необходимости таких действий Java позволяет вызывать подпрограммы, написанные на других языках программирования.
Java повлияла на развитие J++, который разрабатывался компанией Microsoft. Работа над J++ была остановлена из-за судебного иска компании Sun Microsystems, поскольку этот язык программирования был модификацией Java. Позже в новой платформе Microsoft.NET появился J#, облегчающий миграцию программистов J++ или Java на новую платформу. Со временем новый язык программирования С#, стал основным языком платформы, переняв многое из Java. J# включался в версию Microsoft Visual Studio 2005. Язык сценариев JavaScript имеет схожее с Java название и синтаксис, но не связан с Java.
История[править]
История версий
Язык программирования Java зародился в 1991 г. в лабораториях компании Sun Microsystems. Разработку проекта начал Джеймс Гослинг, сам проект назывался «Green» (Зеленый). Создание первой рабочей версии, которая называлась «Oak» (дуб), заняло 18 месяцев. Поскольку оказалось, что имя Oak уже использовалось другой фирмой, то в результате длительных споров вокруг названия нового языка среди ряда предложенных было выбрано название Java[1], в 1995 году язык был официально переименован.[2]
Главным мотивом создания Java была потребность в языке программирования, которая не зависела от платформы (то есть от архитектуры) и которую можно было бы использовать для создания программного обеспечения, которое встраивается в различные бытовые электронные приборы, такие как мобильные средства связи, устройства дистанционного управления и тому подобное.
Довольно скоро почти все популярные тогдашние браузеры получили возможность запускать «безопасные» для системы Java-апплеты внутри веб-страниц. В декабре 1998 года Sun Microsystems выпустила Java 2, где было реализовано несколько конфигураций для различных типов платформ. Например, J2EE предназначалась для создания корпоративных приложений, а значительно урезана J2ME для приборов с ограниченными ресурсами, таких как мобильные телефоны.
13 ноября 2006 года Sun выпустили большую часть Java в качестве свободного и открытого программного обеспечения в соответствии с условиями GNU General Public License (GPL). 8 мая 2007 года корпорация закончила процесс, в результате которого все исходные коды Java были выпущены под GPL, за исключением небольшой части кода, на который Sun не было авторского права.
Период становления Java совпал по времени с расцветом международной информационной службы World Wide Web. Это обстоятельство сыграло решающую роль в будущем Java, поскольку Web тоже требовала платформо-независимых программ. Как следствие, были смещены акценты в разработке Sun из бытовой электроники на программирование для Интернета.
Платформа Java[править]
Под «независимостью от архитектуры» имеется в виду то, что программа, написанная на языке Java, может работать на любой поддерживаемой аппаратной или системной платформе без изменений в исходном коде и перекомпиляции.
Этого можно достичь, компилируя начальный Java-код в байт-код, который представляет собой упрощенные машинные команды. Затем программу можно выполнить на любой платформе, имеет установленную виртуальную машину Java, которая интерпретирует байт-код в код, приспособленный к специфике конкретной операционной системы и процессора. Сейчас виртуальные машины Java существуют для большинства процессоров и операционных систем.
Стандартные библиотеки обеспечивают общий способ доступа к таким платформозависимым особенностям, как обработка графики, многопоточность и работу с сетями. В некоторых версиях для увеличения производительности JVM байт-код можно компилировать в машинный код до или во время выполнения программы.
Основное преимущество использования байт-кода — это портативность. Тем не менее, дополнительные расходы на интерпретацию означает, что интерпретированы программы будут почти всегда работать медленнее, чем скомпилированные в машинный код, и именно поэтому Java получила репутацию «медленного» языка. Однако, этот разрыв существенно сократился после введения нескольких методов оптимизации в современных реализациях JVM.
Одним из таких методов является англ. just-in-time (JIT) компиляция, которая превращает Java байт-код в машинный при первом запуске программы, а затем кэширует его. В результате, такая программа запускается и выполняется быстрее, чем простой интерпретированный код, но ценой дополнительных затрат на компиляцию во время выполнения. Сложные виртуальные машины также используют динамическую перекомпиляцию, которая заключается в том, что ВМ анализирует поведение запущенной программы и выборочно рекомпилирет и оптимизирует некоторые ее части. С использованием динамической рекомпиляции можно достичь большего уровня оптимизации, чем за статической компиляции, поскольку динамический компилятор может делать оптимизации на базе знаний об окружающей среде периода выполнения и о загружены классы. К тому же, он может обнаруживать так называемые горячие точки — части программы, чаще всего внутренние циклы, которые занимают больше всего времени при выполнении. JIT-компиляция и динамическая рекомпиляция увеличивает скорость Java-приложений, не теряя при этом портативности.
Существует еще одна технология оптимизации байт-кода, широко известная как статическая компиляция. Этот метод предполагает, как и традиционные компиляторы, непосредственную компиляцию в машинный код. Это обеспечивает хорошие показатели по сравнению с интерпретацией, но за счет потери переносимости: скомпилированную таким способом программу можно запустить только на одной, целевой платформе.
Скорость официальной виртуальной машины Java значительно улучшилась с момента выпуска ранних версий, к тому же, некоторые испытания показали, что производительность JIT компиляторов по сравнению с обычными компиляторами в машинный код почти одинакова. Однако эффективность компиляторов не всегда свидетельствует о скорости выполнения скомпилированного кода, только тщательное тестирование может выявить истинную эффективность в данной системе.
Обьектность[править]
В противоположность C++, Java — объектно-ориентированный язык. Все данные и действия группируются в классы объектов. Исключением из полной объектности является примитивные типы (int, float и т. д.). Это было сознательным решением проектировщиков языка для увеличения скорости. Поэтому, Java не считается полностью объектно-ориентированным языком.
В Java все объекты являются производными от главного объекта (он называется просто Object), из которого они наследуют базовую поведение и свойства.
Хотя в C++ впервые стало доступно множественное наследование, но в Java возможно только одинарное наследование, благодаря чему исключается возможность конфликтов между членами класса (методы и переменные), которые наследуются от базовых классов.
Безопасность[править]
В намерениях проектировщиков Java была заменить C++ — объектного преемника языка C.[3] Проектировщики начали с анализа свойств C++, которые являются причиной наибольшего числа ошибок, чтобы создать простой, безопасный и безотказный язык программирования.
В Java существует система обработки исключительных ситуаций, например:
- операции над элементом массива за его пределами или над пустым элементом
- чтение с недоступного каталога или неправильного адреса URL
- ввод недопустимых данных пользователем
Одна из особенностей концепции виртуальной машины заключается в том, что ошибки (исключения) не приводят к полному краху системы. Кроме того, существуют инструменты, которые «присоединяются» к среде периода исполнения и каждый раз, когда произошло определенное исключение, записывают информацию из памяти для отладки программы. Эти инструменты автоматизированной обработки исключений предоставляют основную информацию о исключений в программах на Java.
Однако, язык программирования Java не рекомендуется использовать в системах, сбой в работе которых может привести к смерти, травмам или значительных физических повреждениям (например, программное обеспечение для управления атомными электростанциями, полетами, системами жизнеобеспечения или системами вооружения) из-за ненадежности программ, написанных на языке программирования Java.[4]
Автоматическое управление памятью[править]
Java использует автоматический сборщик мусора для управления памятью во время жизненного цикла объекта. Программист решает, когда создавать объекты, а виртуальная машина ответственная за освобождение памяти после того, как объект становится ненужным. Когда к определенному объекту уже не остается ссылок, сборщик мусора автоматически убирать его из памяти. Однако, утечка памяти все же может произойти, если код, написанный программистом, имеет ссылки на уже ненужные объекты, например на объекты, хранящиеся в действующих контейнерах.
Сбор мусора разрешен в любое время. В идеале оно происходит во время бездействия программы. Сборка мусора автоматически форсируется при недостатке свободной памяти в куче для размещения нового объекта, что может приводить к кратковременному зависанию. Поэтому существуют реализации виртуальной машины Java с уборщиком мусора, специально созданным для программирования систем реального времени.
Java не имеет поддержки указателей в стиле C/C++. Это сделано для безопасности и надежности, чтобы позволить сборщику мусора перемещать объекты.
Структура Java-приложения[править]
Структура программы
Программы на Java образованы из классов и интерфейсов. Классы содержат переменные и константы, которые содержат данные, методы, которые выполняют действия, и конструкторы, которые создают экземпляры классов — объекты. Данные могут получить тип (например байт, целое число, символ) или быть ссылкой на объект. Язык Java является статически типизированным.
Лексическая структура[править]
Java-программы записываются в кодировке Unicode, также предоставляется лексическое преобразование, которое позволяет записывать символы Юникода руководящими кодами Unicode с помощью только множества символов ASCII. Язык Java представляет текст последовательностями 16-битных кодовых единиц, используя кодирование UTF-16. За исключением комментариев, идентификаторов и содержания символьных и строчных литералов, все входящие элементы программы на Java состоят из символов ASCII или соответствующих им руководящих кодов Unicode.
Типы данных[править]
Ссылочные типы данных
Java является строго типизированным языком, каждая переменная и выражение имеет тип, известный на этапе компиляции.
Типы данных Java принадлежат к двум категориям: простые (primitive) и определителю (reference). К простым типов принадлежит логический (логический) тип, числовые типы и символьный тип.
Числовые типы состоят из целых типов byte, short, int, long и действительных типов float, double. Символьный тип представлен типом char. Определителю типа состоят из классов, интерфейсов, массивов. Значением вказивникового типа есть указатель на объект — экземпляр класса или массива. Строки являются объектами класса String.
Критика[править]
Критика Java касается заимствования синтаксиса из C/C++ , использование обобщений, быстродействия, обработки чисел без знака, реализации вычислений чисел с плавающей точкой, больших массивов и др.
Использование другими компаниями[править]
Google[править]
При создании Android (операционной системы с открытым кодом) Google взяла за основу Java. Несмотря на то, что операционная система, построенная на ядре Linux, была написана в основном на C , Android SDK использует Java для разработки приложений для платформы Android.
7 мая 2012 года суд Сан-Франциско обнаружил, что если API защищено авторским правом, то Google, используя Java в Android, нарушает авторские права Oracle.[5] Был поднят вопрос о правовом статусе использования Java в Android-устройствах. Однако, уже 31 мая того же года федеральный судья США постановил, что API не могут быть защищены авторским правом.[6]
Графический интерфейс пользователя[править]
Для реализации графического интерфейса (GUI) в Java существуют два основных пакета классов:[7]
- Abstract Window Toolkit (AWT)
- Swing
Преимуществами первого является простота использования, интерфейс подобен интерфейсу операционной системы и несколько лучше быстродействие, поскольку базируется на средствах ОС, правда имеет ограниченный набор графических элементов. Второй пакет Swing реализует собственный Java-интерфейс. Этот пакет создавался на основе AWT, и имеет гораздо больше возможностей и большее количество графических элементов.[8] Swing-компоненты еще называют облегченными, поскольку они написаны полностью на Java и, поэтому, платформонезависимы.
Существуют также сторонние пакеты, самым популярным является Standard Widget Toolkit — стандартный инструментарий виджетов. Разработанный подразделением Rational фирмы IBM и компанией Object Technology International (OTI), сейчас развивается фондом Eclipse.
Источники[править]
- ↑ Different Is NOT Always Better, But Better’s Always Different
- ↑ The Java History Timeline
- ↑ http://java.sun.com/docs/books/tutorial/getStarted/intro/changemylife.html
- ↑ Текст лицензии Microsoft
- ↑ Mullin, Joe. «Google guilty of infringement in Oracle trial; future legal headaches loom»
- ↑ Joe Mullin (31.05.2012). «Google wins crucial API ruling, Oracle’s case decimated». Ars Technica
- ↑ Графический интерфейс на Java (Swing GUI Tutorial)
- ↑ Feigenbaum, Barry. «SWT, Swing or AWT: Which is right for you? (21.02.2006) «
Литература[править]
- Кей С. Хорстманн. Java SE 8. Вводный курс. «Уильямс». ISBN 978-5-8459-1900-7.
- Кей С. Хорстманн, Гари Корнелл (2013). Java. Библиотека профессионала, том 1. Основы. Девятое издание. «Уильямс». ISBN 978-5-8459-1869-7
- Барри Берд (2013). Программирование на Java для чайников, 3-е издание. «Диалектика». ISBN 978-5-8459-1834-5
- Bruce Eckel (2006). Thinking in Java (4th Edition). Prentice Hall PTR. ISBN 978-0131872486
- Joshua Bloch (2008). Effective Java (2nd Edition). Prentice Hall PTR. ISBN 978-0321356680
- James Gosling; Bill Joy, Guy Steele, Gilad Bracha (2005). The Java Language Specification, Third Edition. Addison-Wesley. ISBN 0-321-24678-0
Ссылки[править]
- Java в энциклопедии «Викиреальность»
- Архив всех версий
|
|||
Используемые в разработке |
Ада • |
||
---|---|---|---|
Академические |
Agda • |
||
IEC 61131-3 |
Instruction List • |
||
Прочие |
Алгол • |
||
Эзотерические |
HQ9+/HQ9++ • |
||
Визуальные |
G |
||
Прочее |
Динамические • Компилируемые • |
Класс языка: |
объектно-ориентированный, структурный, императивный |
---|---|
Появился в: |
1995 г. |
Автор(ы): |
Sun Microsystems |
Последняя версия: |
Java Standard Edition 6 (1.6.14) |
Типизация данных: |
строгая полиморфная, статическая, безопасная, именованная (англ.), явная (англ.) |
Основные реализации: |
многочисленные |
Испытал влияние: |
C++, Eiffel |
Повлиял на: |
Ада 2005, C#, D, Groovy, J#, VJ#, PHP, Scala |
Java — объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. В отношении произношения в русском языке, как и в ряде других, образовались две различные нормы — заимствованная англоязычная /ˈdʒɑːvə/[1] и традиционно-национальная «Ява», соответствующая традиционому произношению названия острова Ява.
Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально язык программирования назывался Oak (русск. Дуб) и разрабатывался Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе Java, любимого программистами, поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.
Содержание
- 1 Основные особенности языка
- 2 История версий
- 2.1 Java 1.0
- 2.2 Java 2.0
- 2.3 Java 5
- 3 Классификация платформ Java
- 4 Java и Microsoft
- 5 Применения платформы Java
- 6 Основные возможности
- 7 Пространство имён
- 8 Пример программы
- 9 Основные идеи
- 9.1 Примитивные типы
- 9.1.1 Преобразования при математических операциях
- 9.2 Объектные переменные, объекты, ссылки и указатели
- 9.2.1 Дублирование ссылок и клонирование
- 9.2.2 Сборка мусора
- 9.3 Классы и функции
- 9.3.1 Статические методы и поля
- 9.3.2 Финальность
- 9.3.3 Абстрактность
- 9.3.4 Интерфейсы
- 9.3.4.1 Маркерные интерфейсы
- 9.3.5 Шаблоны в Java (generics)
- 9.3.6 Проверка принадлежности к классу
- 9.1 Примитивные типы
- 10 Библиотеки классов
- 11 Средства разработки ПО
- 12 Примечания
- 13 Литература
- 14 См. также
- 15 Ссылки
Основные особенности языка
Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java-приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология ARM).
Идеи, заложенные в концепцию и различные реализации JVM, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых в среде JVM[2]. Эта идея перекликается с концепцией CLI, заложенной в основу платформы .NET компании
История версий
Java 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1995 году.
Java 2.0
К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Собственно языковых изменений в данной версии не появилось. Платформа получила следующие дополнения:
- Набор средств для создания визуального интерфейса пользователя Swing.
- Коллекции.
- Поддержка файлов Policy и цифровых сертификатов пользователя.
- Библиотека Accessibility.
- Java 2D.
- Поддержка технологии Unicode, включая поддержку ввода на японском, китайском и корейском языках.
- Поддержка воспроизведения аудио-файлов нескольких популярных форматов.
- Полная поддержка технологии
- Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ
Java 5
Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
- Перечислимые типы (enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
- Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе скрытые и абстрактные.
- Перечисление может реализовывать интерфейсы.
- Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым.
- Аннотации — возможность добавления в текст программы метаданных, не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода.
- Средства обобщённого программирования (generics) — механизм, аналогичный шаблонам в C++ (позже также появились и в C#), дающий возможность создавать классы и методы с полями и параметрами произвольного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.
- Методы с неопределённым числом параметров.
- Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int — Integer). Наличие такой возможности упрощает код, поскольку исключает необходимость в выполнении явных преобразований типов в очевидных случаях.
- Разрешён импорт статических переменных.
- В язык введён цикл по коллекции объектов (итератор).
Классификация платформ 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, в которой было произведено улучшение системы безопасности, улучшение поддержки скриптового языка Mozilla Rhino (англ.), улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Java и Microsoft
Компанией ОС, начиная с Windows 95. MSJVM была близка к спецификации Sun Microsystems v.1.1.3, но не соответствовала ей по ряду принципиальных характеристик (в частности, по отсутствию поддержки технологий JNI и по наличию нестандартных расширений). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к [3]. В настоящее время компанией .NET предлагается Java-подобный язык J#, не соответствующий официальной спецификации языка Java.
Применения платформы Java
Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: Amazon[4][5], [6][7], Yandex (неоднозначная информация в отношении Java)[8][9], [10].
Следующие компании в основном фокусируются на Java (J2EE) технологиях, а не на .NET, хотя имеют дело также и с последними: IBM, Oracle. В частности, СУБД Oracle включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры[11].
Основные возможности
- автоматическое управление памятью
- расширенные возможности обработки исключительных ситуаций;
- богатый набор средств фильтрации ввода/вывода;
- набор стандартных коллекций, таких как массив, список, стек и т. п.;
- наличие простых средств создания сетевых приложений (в том числе с использованием протокола HTTP-запросы и обрабатывать ответы;
- встроенные в язык средства создания многопоточных приложений;
- унифицированный доступ к базам данных на основе JDBC и
Пространство имён
Идея пространств имён воплощена в Java-пакетах.
Пример программы
Программа, выводящая «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.
- Классы-обёртки примитивных типов
Byte
Short
Integer
Long
Float
Double
Boolean
Character
Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte. Типы float и 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++. В программе, скомпилированной MS VC++, начиная с версии 7, а также многими другими современными компиляторами (gcc, Intel C++, Borland C++, Comeau и т. д.), значение будет также равно 50000.
Объектные переменные, объекты, ссылки и указатели
В языке 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()
часто является нетривиальной задачей [12].
Сборка мусора
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на освобождение памяти, является присваивание переменной пустого значения null
. Это, однако, не значит, что объект, заменённый значением null
, будет непременно и немедленно удалён. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.
Классы и функции
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» (англ. member function), а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin()
, а есть метод Math.sin()
класса Math
(содержащего, кроме sin()
, методы cos()
, exp()
, sqrt()
, abs()
и многие другие).
Статические методы и поля
Для того чтобы не надо было создавать объект класса Math (и других аналогичных классов) каждый раз, когда надо вызвать sin()
(и другие подобные функции), введено понятие статических методов (англ. static method; иногда в русском языке они называются статичными). Статический метод (отмечаемый ключевым словом static
в описании) можно вызвать, не создавая объекта его класса. Поэтому можно писать
вместо
Math m = new Math(); double x = m.sin(1);
Ограничение, накладываемое на статические методы, заключается в том, что в объекте 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++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.
// Объявление обобщённого класса 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 — для создания химического ПО
Средства разработки ПО
- JDK — помимо набора библиотек для платформ Java SE и Java EE содержит компилятор командной строки javac и набор утилит, также работающих в режиме командной строки.
- NetBeans IDE — бесплатная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Sun Microsystems, разработчиком Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Fortran и др.).
- Java SE и Java EE. Ведутся работы по поддержке в Eclipse платформы Java ME. Пропагандируется C, C++, Fortran и др.)
- IntelliJ IDEA — коммерческая среда разработки для платформ Java SE, Java EE и Java ME.
Примечания
- ↑ java (англ.). Merriam-Webster Online Dictionary. Merriam-Webster. — Английская норма произношения слова «Java». Проверено 5 июня 2009.
- ↑ Robert Tolksdorf. Programming languages for the Java Virtual Machine JVM (англ.). is-research GmbH. — Онлайн-каталог альтернативных языков и языковых расширений для JVM. Проверено 5 июня 2009.
- ↑ Microsoft Java Virtual Machine Support (англ.). Microsoft (2003-09-12). — Официальное заявление Microsoft о программе поддержки MSJVM. Проверено 5 июня 2009.
- ↑ Todd Hoff Amazon Architecture (англ.) (2007-09-18). — Обсуждение архитектуры Amazon с использованием Java-технологий. Проверено 6 июня 2009.
- ↑ Amazon Elastic Compute Cloud (Amazon EC2) (англ.). Amazon Web Services LLC. — Описание технологии и возможностей Amazon EC2 как веб-сервиса. Проверено 6 июня 2009.
- ↑ Todd Hoff eBay Architecture (англ.) (2008-05-27). — Обсуждение архитектуры eBay на платформе Java. Проверено 6 июня 2009.
- ↑ Randy Shoup, Dan Pritchett The eBay Architecture (англ.) (PDF). SD Forum 2006 (2006-11-29). — Презентация по истории развития архитектуры eBay. Проверено 6 июня 2009.
- ↑ Allen Stern Exclusive Interview With Yandex CTO Ilya Segalovich (англ.). CenterNetworks (2008-01-14). — Интервью с техническим директором Яндекса Ильёй Сегаловичем. Проверено 6 июня 2009.
- ↑ Анатолий Орлов Архитектура Яндекс.Поиска (рус.) (PowerPoint). Материалы встречи JUG в Екатеринбурге (2008-05-24). Проверено 6 июня 2009.
- ↑ Brian Guan The LinkedIn Blog. Blog Archive. Grails at LinkedIn. (англ.). LinkedIn.com (2008-06-11). — История создания системы LinkedIn на основе Java-технологии Grails. Проверено 5 июня 2009.
- ↑ OracleJVM and Java Stored Procedures (англ.). Oracle Inc.. — Раздел портала Oracle, посвящённый технологиям Java в составе сервера СУБД Oracle. Проверено 5 июня 2009.
- ↑ Ссылка на документацию к методу Object.clone()(англ.)
Литература
- Монахов Вадим Язык программирования Java и среда NetBeans, 2-е издание. — СПб.: «БХВ-Петербург», 2009. — С. 720. — ISBN 978-5-9775-0424-9
- Джошуа Блох. 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
См. также
- Сравнение C# и Java
- Сравнение возможностей Java с другими языками см. в статье Сравнение языков программирования
Ссылки
- Официальный сайт Java, поддерживаемый Sun
- ru.sun.com — Ресурсы и документации по Java на русском от SUN
- developers.sun.ru — Российский портал разработчиков на русском от Sun Microsystems
- Bruce Eckel’s Free Electronic Books(англ.) — свободно распространяемые электронные версии книг Брюса Эккеля по C++ и Java вместе с исходным кодом
- Статьи о SOA и Java
- http://bruceeckel.by.ru — переводы на русский язык некоторых свободно распространяемых книг Брюса Эккеля по Java
- Canadian Mind Products Java & Internet Glossary — понятно о базовых аспектах Java-технологий
- Все о технологии Java
- Русский сайт о Java: библиотека, форумы, каталог ссылок и т. д.
- Сайт сообщества пользователей Java (Java User Group): встречи пользователей, новости
- Блог сообщества Java-разработчиков КПИ
- Белорусская Java User Group — новости, встречи сообщества, доклады ведущих специалистов, обмен опытом
- TheServerSide: Enterprise Java Community — ServerSide News, Books, Discussions & Reviews
Java |
||
---|---|---|
Платформы | Java Card · Java ME · Java SE · Java EE | |
Технологии Sun | Java · Java Development Kit · · WTK · Java Virtual Machine · · Основные сторонние технологии | GNU Classpath · · Kaffe · TopLink · Apache Harmony · Apache Struts · Spring Framework · Hibernate · JBoss · Processing · Dozer · AspectJ |
История | История версий Java · Критика Java · Java Community Process · Sun Microsystems · Свободные реализации Java | |
Свойства языка | Байткод · Синтаксис · Апплеты · Сервлеты · Мидлеты · JavaServer Pages · Web Start · Enterprise JavaBeans | |
Скриптовые языки | Java Tcl · · · BeanShell · · Judoscript · Sleep · Bean Scripting Framework · Yoix · Rhino | |
Конференции Java | JavaOne |
Основные языки программирования |
||
---|---|---|
Используемые в разработке |
ABAP/4 • Ада • Ассемблеры • C • Кобол • C++ • C# • D • Delphi • Eiffel • Forth • Фортран • Java • J++ • J# • Icon • Лисп • Object Pascal • Оберон • Паскаль • PL/I • Пролог • Visual DataFlex • Visual Basic • VB.NET • Академические |
АПЛ • Лого • Модула-3 • Scala • Рефал • Симула |
Instruction List • Ladder Diagram • SFC |
||
Прочие |
Алгол • Алгол 68 • Модула-2 • Miranda • Эзотерические |
Cписок всех языков |
IDE |
|
---|---|
Универсальные | Visual Studio • NetBeans • KDevelop • Geany • Aptana • Open Watcom |
C/C++ | Borland C++ • C++ Builder • wxDev-C++ • PellesC • Sun Studio • Ultimate++ |
Java | BlueJ • DrJava • Greenfoot • JCreator • JDeveloper • IntelliJ IDEA • |
Pascal | Delphi • MIDletPascal • PocketStudio • Morfik • Turbo Pascal |
Сравнение интегрированных сред разработки программного обеспечения |
Wikimedia Foundation.
2010.
Юрий Пономарев
консультант по программным продуктам Oracle Центра технической поддержки компании РДТЕХ
Java – один из самых востребованных языков программирования в мире и один из двух официальных языков программирования, используемых в разработке Android (другой – Kotlin). Разработчики, знакомые с Java, весьма востребованы и способны создавать широкий спектр различных приложений, игр и инструментов. С помощью этой краткой статьи по Java для начинающих вы сможете сделать свои первые шаги к тому, чтобы стать одним из таких разработчиков. Мы рассмотрим все, что вам нужно знать, чтобы начать работу, и поможем вам создать свое первое простое приложение.
Java-это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems в 1990-х годах (позже купленной Oracle).
Понятие «объектно-ориентированный» относится к способу написания структурного кода Java, а именно: разделение кода на так называемые «классы», которые запускаются вместе, чтобы обеспечить согласованное порождение объектов. Мы обсудим это позже, но достаточно сказать, что это приводит к универсальному и организованному коду, который легко редактировать и перепрофилировать.
Java находится под влиянием C и C++, поэтому она имеет много общего с этими языками (и C#). Одним из больших преимуществ Java является то, что он «платформенно-независимый». Это означает, что код, который вы пишете на одной платформе, можно легко запустить на другой. Это называется принципом «пишем один раз, запускаем где угодно» (хотя на практике это не всегда так просто, как кажется).
Чтобы запустить и использовать Java, вам нужно три вещи:
- JDK – Java Development Kit
- JRE – Java Runtime Environment
- JVM – Java Virtual Machine
Виртуальная машина Java (JVM) гарантирует, что у ваших приложений Java есть доступ к минимальным ресурсам, необходимым для их запуска. Именно благодаря JVM программы Java так легко запускаются на разных платформах.
Среда исполнения Java (JRE) предоставляет собой «контейнер» для всех этих элементов и кода для запуска приложения. JDK – это «компилятор», который интерпретирует сам код и выполняет его. В JDK также есть инструменты разработчика, необходимые для написания кода Java (как и следует из названия).
Хорошая новость заключается в том, что разработчикам нужно только позаботиться о загрузке JDK, поскольку он поставляется вместе с двумя другими компонентами.
Как начать писать на Java
Если вы планируете разрабатывать приложения на Java на своем настольном компьютере, то вам нужно будет загрузить и установить JDK.
Вы можете получить последнюю версию JDK непосредственно с сайта Oracle. Как только вы установите его, ваш компьютер будет иметь возможность понимать и запускать код на Java. Тем не менее, вам все равно понадобится некоторое вспомогательное ПО, чтобы было действительно удобно писать код. Это так называемая «интегрированная среда разработки» или IDE: интерфейс, используемый разработчиками для ввода текста кода и вызова JDK.
При разработке для Android вы будете использовать IDE Android Studio. Она не только послужит интерфейсом для кода на Java (или Kotlin), но и станет мостом для доступа к специфичным для Android вызовам из SDK.
Для целей нашего краткого руководства по Java может быть и проще написать свой код непосредственно в приложении-компиляторе Java. Они могут быть скачаны для Android и iOS, можно даже найти веб-приложения, которые работают в вашем браузере. Эти инструменты предоставляют все необходимое в одном месте и позволяют сразу начать тестирование кода. Например, compilejava.net.
Насколько легко научиться программированию на Java?
Если вы новичок в разработке на Java, то ваши опасения вполне понятны. Так насколько же легко изучить Java?
Этот вопрос имеет несколько субъективную природу, но лично я бы отнес Java к языкам, не самым простым для изучения. Хотя он проще, чем C++, и часто описывается как более удобный для пользователя, но он, безусловно, не столь прост, как такие его конкуренты, как Python или BASIC, которые больше подходят для изучения начинающим программистам.
C# также немного проще по сравнению с Java, хотя они очень похожи.
Конечно, задавшись конкретной целью – стать разработчиком приложений для Android, – проще всего сразу начать с языка, который уже поддерживается этой платформой.
У языка Java есть свои особенности, но его, безусловно, можно изучить, и как только вы его освоите, вам откроется множество возможностей. А поскольку Java имеет много общего с C и C#, вы сможете перейти на эти языки без особых усилий.
Каков синтаксис Java?
Прежде чем мы погрузимся в самую суть этого руководства по Java для начинающих, стоит уделить некоторое время изучению синтаксиса Java.
Синтаксис Java относится к способу написания конкретных алгоритмов. Java очень принципиален в этом вопросе, и, если вы не пишете код определенным образом, то ваша программа не будет работать!
На самом деле я написал целую статью о синтаксисе Java для разработки Android, кратко перечислю особенности синтаксиса:
- Большинство строк должно заканчиваться точкой с запятой «;».
- Исключение составляет строка, открывающая новый блок кода. Она должна начинаться открытой фигурной скобкой «{». В качестве альтернативы эту открытую скобку можно поместить на новую строку под оператором. Блоки кода – это фрагменты кода, которые выполняют определенные, отдельные задачи.
- Код внутри блока кода должен иметь отступ, чтобы отделить его от остальных.
- Открытые блоки кода должны быть закрыты закрывающей фигурной скобкой «}».
- Комментарии – это строки, которым предшествуют символы «//».
Если вы нажимаете кнопку «запустить» или «скомпилировать» и получаете ошибку, то есть большая вероятность, что вы где-то пропустили точку с запятой!
Вы никогда не перестанете делать это, и это никогда не перестанет вас раздражать. Расслабьтесь!
С этими знаниями мы сможем глубже погрузиться в руководство по Java!
Основы Java: ваша первая программа
Зайдите на compilejava.net, и вас встретит редактор с кучей готовых примеров.
(Если же вы предпочитаете использовать другую IDE или стороннее приложение, это тоже прекрасно! Скорее всего, ваш новый проект будет состоять из аналогичного кода).
Удалите все, кроме следующего:
public class HelloWorld
{
public static void main(String[] args)
{
}
}
Это то, что мы, программисты, мы называем «шаблоном» (этот код скопирован из учебника Java от Фила Данфи). Шаблонный код – так можно назвать любой код, который встречается внутри практически любой программы.
Первая строка здесь определяет «класс», который по сути является модулем кода. Затем нам нужен метод внутри этого класса, который представляет собой небольшой блок кода, выполняющий задачу. В каждой программе Java должен быть метод main, так как он сообщает Java, где начинается программа.
Об остальном поговорим чуть ниже, не беспокойтесь. Все, что нам нужно знать для этого урока Java прямо сейчас, – это то, что код, который мы действительно хотим запустить, должен быть помещен в фигурные скобки под словом «main».
Поместите сюда следующий оператор:
System.out.print("Hello world!");
Этот оператор напишет слова: «Hello world!» на вашем экране. Нажмите «Compile & Execute» и вы увидите его в действии.
Поздравляю! Вы только что написали свое первое Java-приложение!
Переменные в Java
Теперь пришло время рассказать о некоторых более важных вещах, лежащих в основе Java. Мало что может быть более фундаментальным в программировании, чем обучение использованию переменных!
Переменная по сути является «контейнером» для некоторых данных. Это означает, что вы выберете слово, которое будет представлять какое-то значение. Нам также необходимо определить переменные, основанные на типе данных, на которые они будут ссылаться.
Вот три основных типа переменных, которые мы собираемся ввести в этом руководстве по Java:
- Целые числа (integers) – как целые числа.
- Плавающие точки (floats) – или «переменные с плавающей точкой». Они содержат все числа, в том числе те, которые представляют десятичные дроби. «Плавающая точка» относится к десятичному разряду.
- Строки (strings)– строки содержат буквенно-цифровые символы и символы. Обычно строка используется для хранения чьего-то имени или, возможно, предложения.
Как только мы определяем переменную, мы можем вставить ее в наш код, чтобы изменить выходные данные. Например:
public class HelloWorld
{
public static void main(String[] args)
{
String name = "Adam";
System.out.print("Hello " + name);
}
}
В этом примере кода мы определили строковую переменную с именем name
. Мы сделали это, используя тип данных String
, за которым следует имя нашей переменной, а затем данные. Когда вы помещаете что-то в двойные кавычки, то Java интерпретирует это дословно как строку.
Теперь мы печатаем на экране, как и раньше, но на этот раз заменяем «Hello world!» на «Hello + имя». Этот код показывает строку «Hello», за которой следует любое значение, содержащееся в следующей строковой переменной!
Самое замечательное в использовании переменных заключается в том, что они позволяют нам манипулировать данными, чтобы наш код мог вести себя динамически. Изменяя значение name
, вы можете изменить поведение программы, не изменяя никакого фактического кода!
Условные операторы в Java
Еще одна из самых важных основ Java – это работа с условными операторами.
Условные операторы используют блоки кода, которые выполняются только при определенных условиях. Например, мы можем захотеть предоставить специальные пользовательские права основному пользователю нашего приложения.
Посмотрите на следующий код:
public class HelloWorld
{
public static void main(String[] args)
{
String name = "Adam";
System.out.print("Hello " + name +"rn");
if (name == "Adam")
{
System.out.print("Special user priveledges granted!");
}
}
}
Запустите этот код, и вы увидите, что специальные разрешения предоставлены. Но, если вы измените значение name
на что-то другое, то код не будет работать.
В этом коде используется оператор if
. Он проверяет, является ли утверждение, содержащееся в скобках, истинным. Если это так, то будет запущен следующий блок кода. Не забудьте сделать отступ в коде, а затем закрыть блок в конце! Если оператор в скобках имеет значение false, то код просто пропустит этот раздел и продолжит работу с закрытых скобок.
Обратите внимание, что при наложении условия на данные мы используем два знака «=». Вы же используете только один, когда присваиваете какие-то данные переменным.
Методы на Java
Еще одна простая концепция, которую мы можем ввести в этом руководстве Java – это использование методов. Это даст вам немного больше понимания того, как структурирован Java-код и что с ним можно сделать.
Все, что мы собираемся сделать, – это взять часть кода, который мы уже написали, а затем поместить его в другой метод вне метода main
:
public class HelloWorld
{
public static void main(String[] args)
{
String name = "Adam";
System.out.print("Hello " + name +"rn");
if (name == "Adam") {
grantPermission();
}
}
static void grantPermission()
{
System.out.print("Special user priveleges granted!");
}
}
Мы создали новый метод в строке, которая начинается со static void
. Это означает, что метод определяет функцию, а не свойство объекта, и что он не возвращает никаких данных.
Но все, что мы вставляем в следующий блок кода, теперь будет выполняться каждый раз, когда мы «вызываем» метод, записывая его имя в нашем коде: grantPermission()
. Затем программа выполнит этот блок кода и вернется к точке, из которой она вышла.
Если бы мы написали вызов grantPermission()
несколько раз, то сообщение «Special user priveleges granted» также отобразилось бы несколько раз. Именно это делает методы такими фундаментальными основами Java: они позволяют выполнять повторяющиеся задачи, не записывая код снова и снова.
Передача аргументов в Java
Но самое замечательное в методах то, что они могут принимать переменные и манипулировать ими. Мы сделаем это, передав переменные в наши методы как «строки». Вот для чего и нужны скобки, следующие за названием метода.
В следующем примере я создал метод, который получает строковую переменную, названную nameCheck
. Затем я могу обратиться к nameCheck
из этого блока кода, и ее значение будет равно тому, что я поместил в фигурные скобки, когда вызвал метод.
Для этого руководства по Java я передал значение name
методу и поместил туда оператор if
. Таким образом, мы можем проверять несколько имен подряд, не набирая один и тот же код снова и снова.
Надеюсь, это даст вам представление о том, насколько мощными могут быть методы!
public class HelloWorld
{
public static void main(String[] args)
{
String name = "Adam";
System.out.print("Hello " + name +"rn");
checkUser(name);
}
static void checkUser(String nameCheck)
{
if (nameCheck == "Adam")
{
System.out.print("Special user priveledges granted!");
}
}
}
В завершение
Надеюсь, теперь у вас есть хорошее представление о том, как изучать Java. Вы даже можете сами написать какой-нибудь простой код: используя переменные и условные операторы, вы действительно можете заставить Java делать некоторые интересные вещи уже сейчас.
Следующий этап состоит в понимании объектно-ориентированного программирования и классов. Это понимание есть то, что действительно дает Java и подобным языкам их силу, но поначалу может быть немного сложным для осмысления.
Перевод статьи «Java tutorial for beginners: Write a simple app with no previous experience»
Java
Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.
Основные особенности
Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Достоинство подобного способа выполнения программ — в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.
Язык Java — язык номер один программирования бизнес-приложений. Бизнес-приложения — это многофункциональные программные системы и комплексы, предназначенные для автоматизации ключевых бизнес-функций и процессов внутри компании. Программисты бизнес-приложений получают в два раза больше программистов других приложений. Наличие таких приложений повышает эффективность ключевых бизнес-процессов предприятия, сократить сроки поиска и обработки информации, экономить материальные и человеческие ресурсы, автоматизировать типовые действия в рамках выполнения процессов и т.д.[1].
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. В последнее время был внесен ряд усовершенствований, которые несколько увеличили скорость выполнения программ на Java:
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++.
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы .NET компанией Microsoft.
Hello world
/* *Hello world на Java *Назовите файл "Hello.java" */ public class Hello { // Программа начинается с обращения к main() public static void main(String[] args){ System.out.println("Hello world!"); } }
Компиляция и запуск
Чтобы скомпилировать программу Hello, запустите компилятор (javac), указав имя исходного файла, в консоли:
javac Hello.java
Компилятор javac создаст файл Hello.class, содержащий версию кода виртуальной машины программы. Чтобы действительно воспользоваться программой, необходимо воспользоваться программой запуска приложений Java, которая носит имя java. При этом ей потребуется передать имя класса Hello в качестве аргумента в консоли:
java Hello
При выполнении на экране отобразится следующий вывод:
Hello world!
Средства разработки
- JDK — помимо набора библиотек для платформ Java SE и Java EE содержит компилятор командной строки javac и набор утилит, также работающих в режиме командной строки.
- Netbeans IDE — свободная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Sun Microsystems, разработчиком Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, PHP, Fortran и др.).
- Eclipse IDE — свободная интегрированная среда разработки для Java SE, Java EE и Java ME[40]. Пропагандируется IBM, одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.).
- IntelliJ IDEA — среда разработки для платформ Java SE, Java EE и Java ME. Разработчик — компания JetBrains. Распространяется в двух версиях: свободной бесплатной (Community Edition) и коммерческой проприетарной (Ultimate Edition).
Источники
- Java — Википедия
- Г. Шилдт — Java. Полное руководство, 8-е изд.