Java (произносится Джава; иногда – Ява) – объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle).
Приложения Java компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры. Дата официального выпуска – 23 мая 1995 года.
Эмблемой Java является чашечка с кофе.
Язык программирования Java произошел от языка «OAK», что в переводе означает «Дуб». После своего появления язык Java начал развиваться по нескольким направлениям:
Java 2 Micro Edition, сокращенно J2ME – это редакция языка Java для разработки приложений для микрокомпьютеров (мобильных телефонов, Palm и т.д.). Сейчас имеет популярность в связи с развитием мобильных микропроцессорных устройств. В нее входят "облегченные" стандартные классы и классы для написания мидлетов (Midlets). Мидлеты специально разрабатываются для небольших устройств, в них поддерживается графика, звук, реакция на события (нажатие кнопок и т.д.). Java ME наиболее полно соответствует начальному предназначению Java – платформы для написания программ для бытовых устройств.
Java 2 Standart Edition, сокращенно J2SE – это стандартная редакция языка Java, используемая для разработки обычных Java приложений. Используя данную редакцию можно создавать консольные приложения и приложения с графическим интерфейсом пользователя. Часто встречается аббревиатура J2SE, которая подразумевает Java 2 Standart Edition.
Java 2 Enterprise Edition, сокращенно J2EE – это редакция языка Java для разработки распределенных приложений масштаба предприятия (корпоративных приложений). Данная редакция включает в себя технологию Enterprise Java Beans (EJB), Java Server Pages (JSP) и сервлеты (Servlets). На данный момент J2EE и .Net сейчас два основных соперника на рынке решений для разработки корпоративных приложений.
Механизм исполнения программ на Java включает в себя виртуальную машину Java, операционную систему и аппаратное обеспечение:
Java Runtime Environment, сокращенно JRE – это исполнительная среда Java, в которой выполняются программы, написанные на этом языке. Среда состоит из виртуальной машины – Java Virtual Machine (JVM) и библиотеки Java классов. По сути это минимальная реализация виртуальной машины, необходимая для исполнения Java приложений, без компилятора и других средств разработки.
Java Virtual Machine, сокращенно JVM – это виртуальная машина Java – основная часть исполняющей среды JRE. Виртуальная машина Java интерпретирует и исполняет байт-код Java. Байт код получают посредством компиляции исходного кода программы с помощью компилятора Java (стандартный – javac). В отличие от классических runtime-библиотек, библиотеки Java-классов входят в состав JRE.
Java Development Kit, сокращенно JDK – это бесплатно распространяемый корпорацией Oracle комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE). В состав JDK не входит интегрированная среда разработки на Java (IDE), поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.
Несмотря на то, что JRE входит в состав JDK, фирма Oracle распространяет этот набор и отдельным файлом. Это вызвано тем, что установка JRE является необходимым и достаточным условием для выполнения Java-программ. Однако для разработки программ JRE недостаточно, необходимо установить пакет JDK, который может установить и JRE и дополнительные компоненты.
Современные интегрированные среды разработки, такие как NetBeans, Oracle JDeveloper, IntelliJ IDEA, Eclipse служат для удобной разработки программного обеспечения на Java. Они опираются на сервисы, предоставляемые JDK, и вызывают для компиляции Java-программ компилятор командной строки из комплекта JDK. Поэтому эти среды разработки либо включают в комплект поставки одну из версий JDK, либо требуют для своей работы предварительной установки JDK на машине разработчика.
Таким образом, для разработки программ на Java достаточно установить JRE+JDK+NetBeans, а только лишь для запуска готовой программы на машине пользователя достаточно установить одну JRE.
Запуск готовых java-программ (с расширением jar) из командной строки производят так:
java -jar JavaApplication1.jar
В данном примере запускается на выполнение программа JavaApplication1.jar.
NetBeans IDE – свободная интегрированная среда разработки приложений (IDE) на языках программирования Java, Python, PHP, JavaScript, C, C++, и ряда других.
Проект NetBeans IDE поддерживается и спонсируется компанией Oracle, однако разработка NetBeans ведется независимым сообществом разработчиков-энтузиастов (NetBeans Community) и компанией NetBeans Org.
По качеству и возможностям последние версии NetBeans IDE не уступают лучшим коммерческим (платным) интегрированным средам разработки для языка Java, таким, как IntelliJ IDEA, поддерживая рефакторинг, профилирование, выделение синтаксических конструкций цветом, автодополнение набираемых конструкций на лету, множество предопределённых шаблонов кода и др.
Для разработки программ в среде NetBeans и для успешной инсталляции и работы самой среды NetBeans должен быть предварительно установлен JDK или J2EE SDK подходящей версии. Среда разработки NetBeans поддерживает разработку для платформ J2SE и J2EE и для мобильных платформ J2ME.
Рабочая папка проектов по-умолчанию:
C:\Documents and Settings\<ИМЯ_ПОЛЬЗОВАТЕЛЯ>\Мои документы\NetBeansProjects.
Запуск программы на выполнение: Заходим в меню "Выполнить" – "Запустить проект" (F6).
Закрытие проекта: Заходим в меню "Файл" – "Закрыть проект" (Для закрытия необходимо предварительно выделить проект мышью в окне «Проекты»).
Сохранение проекта: Заходим в меню "Файл" – "Сохранить все" (Ctrl+Shift+S).
Открытие ранее сохраненного проекта: Заходим в меню "Файл" – "Открыть проект" (Ctrl+Shift+O).
Настройка конфигурации проекта: Заходим в меню "Выполнить" – "Установить конфигурацию проекта – Настроить", далее выбираем категорию «Выполнение» – Выбираем главный класс для запуска программы – «ОК».
Получение готового исполняемого jar-файла: заходим в меню "Выполнить" – "Очистить и собрать проект" (Shift+F11). Готовый jar-файл находится в папке "dist" проекта.
Целые типы. Служит для хранения целых чисел.
Тип | Размер, бит | Минимальное значение | Максимальное значение |
byte | 8 | -128 | 127 |
short | 16 | -32768 | 32767 |
int | 32 | -2147483648 | 2147483647 |
long | 64 | -922372036854775808 | 922372036854775807 |
byte b1 = 50, b2 = -99, bЗ;
byte a1 = 0xF1, a2 = 0x07;
short det = 0, ind = 1;
int i = -100, j = 100, k = 9999;
long big = 50;
Оператор | Название | Пример | Примечание |
+ | Оператор сложения | i+j | В случае, когда операнды i и j имеют разные типы или типы byte, short или char, действуют правила автоматического преобразования типов |
– | Оператор вычитания | i-j | |
* | Оператор умножения | i*j | |
/ | Оператор деления | i/j | Результат округляется до целого путем отбрасывания дробной части как для положительных, так и для отрицательных чисел |
% | Оператор остатка от целочисленного деления | i%j | Возвращается остаток от целочисленного деления |
= | Оператор присваивания | v=i | Сначала вычисляется выражение i, после чего полученный результат копируется в ячейку v |
++ | Оператор инкремента (увеличения на 1) | v++ | v++ эквивалентно v=v+1 |
-- | Оператор декремента (уменьшения на 1) | v– | v– эквивалентно v=v-1 |
+= | v+=i | v+=i эквивалентно v=v+i | |
-= | v-=i | v-=i эквивалентно v=v-i | |
*= | v*=i | v*=i эквивалентно v=v*i | |
/= | v/=i | v/=i эквивалентно v=v/i | |
%= | v%=i | v%=i эквивалентно v=v%i |
Символьный тип. Служит для хранения одного символа.
Тип | Размер, бит | Минимальное значение | Максимальное значение |
char | 16 | 0 | 65536 |
char c1 = 'A', c2 = '?', newLine = '\n';
char s2 = '\u0042';
Escape-последовательность | Функция | Значение в Unicode |
\b | Забой (backspace) | \u0008 |
\t | Горизонтальная табуляция (horizontaltab) | \u0009 |
\n | Перевод строки (linefeed) | \u000A |
\f | Перевод страницы (form feed) | \u000C |
\r | Возврат каретки (carriage return) | \u000D |
\" | Двойная кавычка (double quote) | \u0022 |
\' | Апостроф (single quote) | \u0027 |
\\ | Обратная косая черта (backslash) | \u005C |
Вещественные типы. Служат для хранения целых и вещественных чисел.
Тип | Разрядность (бит) | Диапазон | Точность |
float | 32 | 3,4e-38 < |x| < 3,4e38 | 7-8 цифр |
double | 64 | 1,7e-308 < |x| < 1,7e308 | 17 цифр |
float х = 0.001, у = -34.789;
double 21 = -16.2305, z2;
float x1 = 3.5f, x2 = 3.7E6f, x3 = -1.8E-7f;
Оператор | Название | Пример | Примечание |
+ | Оператор сложения | x+y | В случае, когда операнды x и y имеют разные типы, действуют правила автоматического преобразования типов. |
– | Оператор вычитания | x-y | |
* | Оператор умножения | x*y | |
/ | Оператор деления | x/y | Результат является вещественным. В случае, когда операнды x и y имеют разные типы, действуют правила автоматического преобразования типов. |
% | Оператор остатка от целочисленного деления | x%y | Возвращается остаток от целочисленного деления x на y. В случае, когда операнды x и y имеют разные типы, действуют правила автоматического преобразования типов. |
= | Оператор присваивания | v=x | Сначала вычисляется выражение x, после чего полученный результат копируется в ячейку v |
++ | Оператор инкремента(увеличения на 1) | v++ ++v | эквивалентно v=v+1 |
-- | Оператор декремента(уменьшения на 1) | v– –v | эквивалентно v=v-1 |
+= | v+=x | эквивалентно v=v+x | |
-= | v-=x | эквивалентно v=v-x | |
*= | v*=x | эквивалентно v=v*x | |
/= | v/=x | эквивалентно v=v/x | |
%= | v%=x | эквивалентно v=v%x |
Математические функции, а также константы "пи" (Math.PI) и "е" (Math.E) заданы в классе Math, находящемся в пакете java.lang.
Для того чтобы их использовать, надо указывать имя функции или константы, квалифицированное впереди именем класса Math.
Оператор класса Math | Примечание |
Тригонометрические и обратные тригонометрические функции | |
sin(x) | sin(x) – синус |
cos(x) | cos(x) – косинус |
tan(x) | tg(x) – тангенс |
asin(x) | arcsin(x) – арксинус |
acos(x) | arccos(x) – арккосинус |
atan(x) | arctg(x) – арктангенс |
atan2(y, x) | Возвращает угол, соответствующий точке с координатами x,y, лежащий в пределах |
toRadians(angdeg) | angdeg / 180.0 * PI; – перевод углов из градусов в радианы |
toDegrees(angrad) | angrad * 180.0 / PI; – перевод углов из радиан в градусы |
Степени, экспоненты, логарифмы | |
exp(x) | – экспонента |
expm1(x) | . При x, близком к 0, дает гораздо более точные значения, чем |
log(x) | ln(x) – натуральный логарифм |
log10(x) | – десятичный логарифм |
log1p(x) | . При x, близком к 0, дает гораздо более точные значения, чем |
sqrt(x) | – квадратный корень |
cbrt(x) | – кубический корень |
hypot(x,y) | – вычисление длины гипотенузы по двум катетам |
pow(x, y) | – возведение x в степень y |
sinh(x) | – гиперболический синус |
cosh(x) | – гиперболический косинус |
tanh(x) | – гиперболический тангенс |
Модуль, знак, минимальное, максимальное число | |
abs(m) | Абсолютное значение числа. Аргумент типа int, long, float или double. Результат того же типа, что аргумент |
abs(x) | |
signum(a) | Знак числа. Аргумент типа float или double. Результат того же типа, что аргумент |
signum(x) | |
min(m,n) | Минимальное из двух чисел. Аргументы одного типа. Возможны типы: int, long, float, double. Результат того же типа, что аргумент |
min(x,y) | |
max(m,n) | Максимальное из двух чисел. Аргументы одного типа. Возможны типы: int, long, float, double. Результат того же типа, что аргумент |
max(x,y) | |
Округления | |
ceil(x) | Ближайшее к x целое, большее или равное x |
floor(x) | Ближайшее к x целое, меньшее или равное x |
round(a) | Ближайшее к x целое. Аргумент типа float или double. Результат типа long, если аргументdouble, и типа int – если float. То же, что (int)floor(x + 0.5). |
round(x) | |
rint(x) | Ближайшее к x целое. |
ulp(a) | Расстояние до ближайшего большего чем аргумент значения того же типа ("дискретность" изменения чисел в формате с плавающей точкой вблизи данного значения). Аргумент типа float или double. Результат того же типа, что аргумент |
ulp(x) | |
Случайное число, остаток | |
random() | Псевдослучайное число в диапазоне от 0.0 до 1.0. При этом |
IEEEremainder(x,y) | Остаток от целочисленного деления x/y, то есть x-y*n, где n – результат целочисленного деления |
Булевский (логический) тип. Служит для хранения логического значения true («Истина») или false («Ложь»).
boolean a, b;
a=true; b=a; c=false;
Оператор | Название | Пример |
&& | логическое "И" ( and ) | a&&b |
|| | логическое "ИЛИ" ( or ) | a||b |
^ | логическое "исключающее ИЛИ" ( xor ) | a^b |
! | логическое "НЕ" ( not ) | !a |
== | равно | a==b |
!= | не равно | a!=b |
> | больше | a>b |
< | Меньше | a<b |
>= | больше или равно | a>=b |
<= | меньше или равно | a<=b |
Определение управляющих конструкций в Java практически во всём совпадает с C++.
Условные конструкции if … else. Наиболее распространённой формой управляющих структур является конструкция if … else, синтаксис которой выглядит следующим образом:
if (БулевскоеВыражение) {
Инструкции1;
} else {
Инструкции2;
}
Сначала осуществляется проверка значения булевского выражения. Если результат равен true, выполняется блок Инструкции1, в противном случае (и при наличии предложения else) – блок Инструкции2. Предложение else может быть пропущено, при этом конструкция if … else принимает более краткий вид:
if (БулевскоеВыражение) {
Инструкции;
}
int m = 4;
if (m == 4) {
System.out.println("April");
}
run: April
В этом случае при ложном значении булевского выражения никаких операций не выполняется. Возможна также и вложенность конструкций if … else:
if (БулевскоеВыражение1) {
Инструкции1
} else if (БулевскоеВыражение2) {
Инструкции2
} else {
Инструкции3
}
int month = 4;
String season;
if (month == 12 || month == 1 || month == 2) {
season = "Winter";
} else if (month == 3 || month == 4 || month == 5) {
season = "Spring";
} else if (month == 6 || month == 7 || month == 8) {
season = "Summer";
} else if (month == 9 || month == 10 || month == 11) {
season = "Autumn";
} else {
season = "Bogus Month";
}
System.out.println("April is in the " + season + ".");
run: April is in the Spring.
Некоторым аналогом конструкции if … else является операция «?» со следующим синтаксисом:
БулевскоеВыражение ? Значение1 : Значение2
где Значение1, Значение2 – вычисляемые значения одного типа.
Результатом этой операции будет Значение1, если БулевскоеВыражение истинно, в противном случае –Значение2.
int m = 4; String season;
season = m == 4 ? "April" : "???";
System.out.println(season);
run: April
Условные конструкции switch – case. Конструкция switch позволяет передавать управление тому или иному блоку кода, обозначенному оператором case в зависимости от значения выражения:
switch (Выражение) {
case Значение1:
Инструкции;
case Значение2:
Инструкции;
…
default:
Инструкции;
}
Значение Выражения может иметь один из типов: byte, short, int, char. Каждому оператору case ставится в соответствие константа-значение. Если значение выражения совпадает со значением оператора case, то управление передаётся первой инструкции данного блока case.
Для выхода из конструкции после завершения инструкций блока используется команда break. Если не прервать исполнение командой break, то будет исполняться блок инструкций, соответствующий следующему значению.
Если значение выражения не совпало ни с одним из значений операторов case, то выполняется первая инструкция блока default. Если же метка default отсутствует, выполнение оператора switch завершается.
int month = 4;
String season;
switch (month) {
case 12:
case 1:
case 2:
season = "зима"; break;
case 3:
case 4:
case 5:
season = "весна"; break;
case 6:
case 7:
case 8:
season = "лето"; break;
case 9:
case 10:
case 11:
season = "осень"; break;
default:
season = "Нет такого месяца";
}
System.out.println("Апрель – это " + season + ".");
run: Апрель – это весна.
Циклы for. Выражение for применяется для организации циклического перехода по значениям из заданного диапазона и в общем виде выглядит так:
for (СекцияИнициализации; БулевскоеВыражение; Секция изменения) Инструкция;
Обработка цикла происходит в следующем порядке:
– инициализация;
– проверка условия завершения;
– исполнение тела цикла;
– инкрементация счётчика.
Все секции заголовка цикла for являются необязательными. Если СекцияИнициализации опускается, на её месте остаётся только символ точки с запятой. Если же из заголовка исключается БулевскоеВыражение, в качестве значения логического условия подразумевается литерал true. Исключение всех трёх секций приводит к тому, что цикл становится «бесконечным»:
for (;;) {
Инструкции;
}
for (int i = 1; i <= 10; i++) {
System.out.println("i = " + i);
}
run:
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
for (int n = 10; n > 0; n–) {
System.out.println("n= " + n);
}
run:
n= 10
n= 9
n= 8
n= 7
n= 6
n= 5
n= 4
n= 3
n= 2
n= 1
int a, b;
for (a = 1, b = 4; a < b; a++, b–) {
System.out.println("a = " + a);
System.out.println("b = " + b);
}
run:
a = 1
b = 4
a = 2
b = 3
Циклы while. Синтаксис циклической конструкции while выглядит так:
while (БулевскоеВыражение)
Инструкция;
int n = 5;
while (n > 0) {
System.out.println("while " + n);
n–;
}
run:
while 5
while 4
while 3
while 2
while 1
Сначала осуществляется проверка булевского выражения. Если результат равен true, выполняется Инструкция (в качестве инструкции может быть использован блок), после чего булевское выражение проверяется вновь, и процесс повторяется до тех пор, пока в результате проверки не будет получено значение false.
Циклы do … while. Если требуется исполнить тело цикла хотя бы 1 раз, используется конструкция do … while:
do
while (БулевскоеВыражение)
int n = 5;
do {
System.out.println("do-while " + n);
} while (–n > 0);
run:
do-while 5
do-while 4
do-while 3
do-while 2
do-while 1
В этом случае проверка истинности логического выражения осуществляется после выполнения тела цикла.
В теле циклов можно использовать две особые инструкции:
– break – применяется для завершения выполнения цикла;
– continue – передаёт управление в конец тела цикла (т.е. начинает следующую итерацию). В ситуациях с while и do это приводит к выполнению проверки условия цикла, а при использовании в теле for инструкция continue производит передачу управления секции изменения значения переменных цикла.
Метки. В Java отсутствует оператор goto. Но хотя программирование с применением goto и считается плохим тоном, существуют задачи, в которых его использование очень удобно. Основным примером такой ситуации является совершение выхода одновременно из двух вложенных циклов.
Эта проблема решается в Java использованием меток. Любая инструкция в программе может быть снабжена меткой, которая представляет собой содержательное имя, позволяющее сослаться на соответствующую инструкцию.
метка: инструкция
Несмотря на то, что метка может быть установлена перед любой инструкцией, на практике имеет смысл применять метки только перед циклическими конструкциями for, while, do, условными конструкциями if, switch и блоками {}. Чтобы «выбраться» из вложенного цикла или блока, достаточно снабдить меткой соответствующий внешний блок и указать её в команде break, которая передаёт управление первой инструкции, следующей за блоком.
Примеры:
В данном случае break осуществит выход сразу из двух циклов.
Ещё один пример выхода из сложной конструкции:
boolean t = true;
a:
{
b:
{
c:
{
System.out.println("До break");
if (t) {
break b;
}
System.out.println("He будет выполнено ");
}
System.out.println("He будет выполнено ");
}
System.out.println("После break");
}
run:
До break
После break
Выход из методов (процедур). В Java для реализации выхода из методов (процедур) используется метод return, который приведет к немедленному завершению работы и передаче управления коду, вызвавшему этот метод. Ниже приведен пример, иллюстрирующий использование оператора return:
boolean t = true;
System.out.println("До return");
if (t) { return; }
System.out.println("Этo не будет выполнено ");
run:
До return
Для выхода из программы используется метод System.exit(КодОшибки). Если программа заканчивается нормально, то КодОшибки должен быть 0:
System.exit(0);
Одномерные массивы служат для хранения линейного списка с данными. Статические массивы поддерживаются на уровне Java-синтаксиса. Число элементов указывается явно при создании объекта массива или определяется автоматически при перечислении элементов массива. По умолчанию элементы массива объектов устанавливаются в null или в 0 для простых типов. Индексация элементов начинается с 0. Размер массива определяется через функцию length.
Рассмотрим пример работы с одномерными статическими массивами:
package tsn01.array;
import java.util.Arrays;
public class TSN01_Array {
public static void main(String[] args) {
// Пример работы с одномерными статическими массивами
int a[], b[]; // Переменные-массивы целых чисел
a = new int[10]; // Создание массива без инициализации
b = new int[]{1, 2, 3, 4}; // Создание массива с инициализацией
String s[] = new String[] {"Hello ", "world", "!!!"}; // Описываем и создаем массив строк
Arrays.fill(a, 0); // Заполнить массив нулями
a[0] = 20; a[1] = 10; a[2] = 5; a[3] = 33; // Устанавливаем значения 4 элементам
Arrays.fill(a, 5,10,-1); // Присвоить с 5 по 9 (10-1) элементам значение "-1"
Arrays.sort(a); // Сортируем массив
b[3] = b[1]*0b11+b[2]*0x2; // Рассчитываем значение для 4 элемента
System.out.println(Arrays.toString(a)); // Вывод на экран массива "a"
System.out.println(Arrays.toString(b)); // Вывод на экран массива "b"
System.out.println(Arrays.toString(s)); // Вывод на экран массива "s"
// Вывод на экран размеров массивов
System.out.println("Количество элементов в массиве \"a\": " + a.length);
System.out.println("Количество элементов в массиве \"b\": " + b.length);
System.out.println("Количество элементов в массиве \"str\": " + s.length);
System.out.println(s[0] + s[1]); // Доступ к элементам массива
}
}
Результат работы программы:
[-1, -1, -1, -1, -1, 0, 5, 10, 20, 33]
[1, 2, 3, 12]
[Hello , world, !!!]
Количество элементов в массиве "a": 10
Количество элементов в массиве "b": 4
Количество элементов в массиве "str": 3
Hello world