SlideShare a Scribd company logo
Базовый синтаксис Java
Алексей Владыкин
15 сентября 2014
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 1 / 70
1 Система типов Java
Примитивные типы
Преобразование типов
Ссылочные типы
2 Управляющие конструкции
Условные операторы
Циклы
3 Примеры
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 2 / 70
Система типов Java
Примитивные типы
boolean
char
byte, short, int, long
float, double
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70
Система типов Java
Примитивные типы
boolean
char
byte, short, int, long
float, double
Зарезервированные ключевые
слова языка
Не имеют полей и методов
Передаются по значению
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70
Система типов Java
Ссылочные типы
Все остальные
Являются объектами (наследуют java.lang.Object)
Имеют поля и методы
Передаются по ссылке
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 4 / 70
Система типов Java Примитивные типы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 5 / 70
Система типов Java Примитивные типы
Тип boolean
Литералы: false, true
Результат любого сравнения — boolean:
< > ==
<= >= !=
Нет преобразования между boolean и другими
примитивными типами
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 6 / 70
Система типов Java Примитивные типы
Логические операции
and && & &=
or || | |=
xor ˆ ˆ=
not !
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70
Система типов Java Примитивные типы
Логические операции
and && & &=
or || | |=
xor ˆ ˆ=
not !
&& и || — вычисление по сокращенной схеме
& и | — вычисление по полной схеме
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70
Система типов Java Примитивные типы
java.lang.Boolean
Класс-обертка для boolean
boolean parseBoolean(String)
String toString(boolean)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 8 / 70
Система типов Java Примитивные типы
Тип char
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 9 / 70
Система типов Java Примитивные типы
Символьные значения
char — 16 бит, беззнаковый
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
Система типов Java Примитивные типы
Символьные значения
char — 16 бит, беззнаковый (0 .. 216 − 1)
Представляет номер символа в кодировке Unicode
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
Система типов Java Примитивные типы
Символьные значения
char — 16 бит, беззнаковый (0 .. 216 − 1)
Представляет номер символа в кодировке Unicode
Литералы:
символ в одинарных кавычках: ’a’
шестнадцатеричный код символа: ’u78bc’
спецпоследовательности: ’t’, ’n’, ’r’, ’”, ’’
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
Система типов Java Примитивные типы
Символьные значения
char — 16 бит, беззнаковый (0 .. 216 − 1)
Представляет номер символа в кодировке Unicode
Литералы:
символ в одинарных кавычках: ’a’
шестнадцатеричный код символа: ’u78bc’
спецпоследовательности: ’t’, ’n’, ’r’, ’”, ’’
Свободно конвертируется в числовые типы и обратно
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
Система типов Java Примитивные типы
Суррогаты
В современном Unicode больше символов,
чем влезает в 16 бит
Поэтому некоторые Unicode-сиволы в Java представляются двумя
char’ами — суррогатной парой
Такие символы можно хранить и в int
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 11 / 70
Система типов Java Примитивные типы
java.lang.Character
Класс-обертка для char
char toLowerCase(char)
char toUpperCase(char)
boolean isLowerCase(char)
boolean isUpperCase(char)
boolean isDigit(char)
boolean isLetter(char)
boolean isHighSurrogate(char)
boolean isLowSurrogate(char)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 12 / 70
Система типов Java Примитивные типы
Целочисленные типы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 13 / 70
Система типов Java Примитивные типы
Диапазоны значений
Тип Бит Диапазон
byte 8 −128 .. + 127
short 16 −215
.. + 215
− 1
int 32 −231
.. + 231
− 1
long 64 −263
.. + 263
− 1
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70
Система типов Java Примитивные типы
Диапазоны значений
Тип Бит Диапазон
byte 8 −128 .. + 127
short 16 −215
.. + 215
− 1
int 32 −231
.. + 231
− 1
long 64 −263
.. + 263
− 1
Размер фиксирован, одинаков для всех платформ
Все типы знаковые, беззнаковых вариантов нет
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70
Система типов Java Примитивные типы
Литералы
Десятичное число: 123
Восьмеричное число: 0123
Шестнадцатеричное число: 0x123
Двоичное число: 0b101 (с Java 7)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70
Система типов Java Примитивные типы
Литералы
Десятичное число: 123
Восьмеричное число: 0123
Шестнадцатеричное число: 0x123
Двоичное число: 0b101 (с Java 7)
С подчеркиванием: 123_456_789 (с Java 7)
С суффиксом L для long
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70
Система типов Java Примитивные типы
Арифметические операции
сложение + +=
вычитание - -=
умножение * *=
деление / /=
остаток % %=
инкремент ++
декремент --
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70
Система типов Java Примитивные типы
Арифметические операции
сложение + +=
вычитание - -=
умножение * *=
деление / /=
остаток % %=
инкремент ++
декремент --
Деление целочисленное
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70
Система типов Java Примитивные типы
Особые случаи
Деление на ноль — исключительная ситуация,
бросается ArithmeticException
Переполнение не является исключительной ситуацией,
лишние старшие биты просто выкидываются
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 17 / 70
Система типов Java Примитивные типы
Побитовые операции
not ~
and & &=
or | |=
xor ˆ ˆ=
shr >> >>=
shr’ >>> >>>=
shl << <<=
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70
Система типов Java Примитивные типы
Побитовые операции
not ~
and & &=
or | |=
xor ˆ ˆ=
shr >> >>=
shr’ >>> >>>=
shl << <<=
>> — арифметический сдвиг
>>> — логический сдвиг
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70
Система типов Java Примитивные типы
Классы-обертки
java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long
MIN_VALUE
MAX_VALUE
toString(typename)
parseTypename(String)
bitCount(typename)
reverse(typename)
reverseBytes(typename)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 19 / 70
Система типов Java Примитивные типы
Вещественные типы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 20 / 70
Система типов Java Примитивные типы
Стандарт IEEE754
Число в представлено в виде ±m · 2e
Тип Бит Знак Мантисса Экспонента
float 32 1 23 8
double 64 1 52 11
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 21 / 70
Система типов Java Примитивные типы
Литералы
Обычная запись: -1.234
Экспоненциальная запись: -123.4e-2 (−123.4 · 10−2)
Шестнадцатеричная запись: 0xFFFFpFF (FFFF · 2FF )
С суффиксом типа:
38f
3e19d
123.4e-2f
444.444d
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 22 / 70
Система типов Java Примитивные типы
Операции
сложение + +=
вычитание - -=
умножение * *=
деление / /=
остаток % %=
инкремент ++
декремент --
Побитовые операции не поддерживаются
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 23 / 70
Система типов Java Примитивные типы
Особые случаи
Деление положительного числа на 0 дает +∞
Деление отрицательного числа на 0 дает −∞
Деление 0 на 0 дает NaN
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
Система типов Java Примитивные типы
Особые случаи
Деление положительного числа на 0 дает +∞
Деление отрицательного числа на 0 дает −∞
Деление 0 на 0 дает NaN
Переполнение дает +∞ или −∞,
в зависимости от направления
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
Система типов Java Примитивные типы
Особые случаи
Деление положительного числа на 0 дает +∞
Деление отрицательного числа на 0 дает −∞
Деление 0 на 0 дает NaN
Переполнение дает +∞ или −∞,
в зависимости от направления
Любая арифметическая операция с NaN дает NaN
NaN != NaN
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
Система типов Java Примитивные типы
strictfp
Java использует FPU для вычислений с плавающей точкой
Регистры FPU могут быть шире 64 бит
Результаты вычислений могут отличаться
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70
Система типов Java Примитивные типы
strictfp
Java использует FPU для вычислений с плавающей точкой
Регистры FPU могут быть шире 64 бит
Результаты вычислений могут отличаться
Модификатор strictfp включает режим строгой совместимости,
результаты будут идентичны на любом процессоре
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70
Система типов Java Примитивные типы
Классы-обертки
java.lang.Float
java.lang.Double
MIN_VALUE
MAX_VALUE
POSITIVE_INFINITY
NEGATIVE_INFINITY
NaN
boolean isNaN(typename)
toString(typename)
parseTypename(String)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 26 / 70
Система типов Java Примитивные типы
java.lang.Math
константы: E, PI
тригонометрия: sin, cos
степени: sqrt, pow, exp
min, max
. . .
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 27 / 70
Система типов Java Преобразование типов
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 28 / 70
Система типов Java Преобразование типов
Неявное преобразование типов
Преобразование целочисленных типов в более емкие
(byte → short → int → long)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
Система типов Java Преобразование типов
Неявное преобразование типов
Преобразование целочисленных типов в более емкие
(byte → short → int → long)
Преобразование char в int и long
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
Система типов Java Преобразование типов
Неявное преобразование типов
Преобразование целочисленных типов в более емкие
(byte → short → int → long)
Преобразование char в int и long
Преобразование целочисленные типов в типы с плавающей точкой
(возможна потеря точности)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
Система типов Java Преобразование типов
Явное преобразование типов
Оператор приведения типа: (typename)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
Система типов Java Преобразование типов
Явное преобразование типов
Оператор приведения типа: (typename)
При приведении более емкого целого типа к менее емкому
старшие биты просто отбрасываются
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
Система типов Java Преобразование типов
Явное преобразование типов
Оператор приведения типа: (typename)
При приведении более емкого целого типа к менее емкому
старшие биты просто отбрасываются
При приведении типа с плавающей точкой к целому типу
дробная часть отбрасывается (никакого округления)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
Система типов Java Преобразование типов
Явное преобразование типов
Оператор приведения типа: (typename)
При приведении более емкого целого типа к менее емкому
старшие биты просто отбрасываются
При приведении типа с плавающей точкой к целому типу
дробная часть отбрасывается (никакого округления)
Слишком большое дробное число при приведении к целому
превращается в MAX_VALUE или MIN_VALUE
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
Система типов Java Преобразование типов
Явное преобразование типов
Оператор приведения типа: (typename)
При приведении более емкого целого типа к менее емкому
старшие биты просто отбрасываются
При приведении типа с плавающей точкой к целому типу
дробная часть отбрасывается (никакого округления)
Слишком большое дробное число при приведении к целому
превращается в MAX_VALUE или MIN_VALUE
Слишком большой double при приведении к float превращается
в Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
Система типов Java Преобразование типов
Автоматическое расширение
При вычислении выражения (a @ b) аргументы a и b
преобразовываются в числа, имеющие одинаковый тип:
если одно из чисел double, то в double;
иначе, если одно из чисел float, то в float;
иначе, если одно из чисел long, то в long;
иначе оба числа преобразуются в int.
byte b = 1;
byte c = b + 1; // compilation error
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 31 / 70
Система типов Java Преобразование типов
Неявное приведение с потерей данных
Сокращенная запись var @= expr
раскрывается в var = (typename) (var @ (expr))
Неявно срабатывает приведение типа, в том числе с потерей
данных
short n = -1;
while (n != 0) {
n >>>= 1;
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 32 / 70
Система типов Java Преобразование типов
Boxing/unboxing
Autoboxing: примитивное значение → объект-обертка
Autounboxing: объект-обертка → примитивное значение
Integer i = 1;
Integer j = i + 1;
int k = i + j;
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 33 / 70
Система типов Java Ссылочные типы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 34 / 70
Система типов Java Ссылочные типы
Ссылочные типы
Все остальные, кроме примитивных
Передаются по ссылке
Являются объектами (наследуют java.lang.Object)
Имеют поля и методы
Ссылка может принимать значение null
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 35 / 70
Система типов Java Ссылочные типы
Массивы
Массив обозначается квадратными скобками
int[] numbers;
String [] args;
boolean bits [];
char [] letters , digits;
float rates[], maxRate;
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 36 / 70
Система типов Java Ссылочные типы
Создание
Массив создается оператором new
Все элементы массива инициализируются нулями
Размер массива фиксируется в момент создания
int[] numbers = new int [100];
String [] args = new String [1];
boolean [] bits = new boolean [0];
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 37 / 70
Система типов Java Ссылочные типы
Инициализация
Можно перечислить значения всех элементов
при создании массива
int[] numbers = new int[] {1, 2, 3, 4, 5};
boolean [] bits = new boolean [] {true , true , false };
// this works only in variable declaration
char [] digits = {
’0’, ’1’, ’2’, ’3’, ’4’,
’5’, ’6’, ’7’, ’8’, ’9’};
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 38 / 70
Система типов Java Ссылочные типы
Индексация
Элементы индексируются с нуля
Длина массива доступна как array.length
При выходе за границы массива бросается исключение
int[] numbers = {1, 2, 3, 4, 5};
// numbers.length -> 5
// numbers [0] -> 1
// numbers [1] -> 2
// numbers [4] -> 5
// numbers [5] -> ArrayIndexOutOfBoundsException
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 39 / 70
Система типов Java Ссылочные типы
Многомерные массивы
Многомерный массив — это массив массивов
int [][] matrix0;
int [][] matrix1 = new int [2][2];
int [][] matrix2 = {{1, 2}, {3, 4}};
int[] row = matrix2 [0]
// matrix2 [1][1] -> 4
// row [0] -> 1
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 40 / 70
Система типов Java Ссылочные типы
Многомерные массивы
Разрешены ступенчатые массивы
int [][] triangle = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9},
{10, 11, 12},
{13, 14},
{15}};
// triangle.length -> 5
// triangle [0]. length -> 5
// triangle [4]. length -> 1
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 41 / 70
Система типов Java Ссылочные типы
Представление в памяти
Одномерный массив занимает непрерывный участок памяти
Двумерный массив занимает n + 1 участок в памяти,
где n — первая размерность
int [][] a = new int [10][1000];
int [][] b = new int [1000][10];
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 42 / 70
Система типов Java Ссылочные типы
Varargs
Специальный синтаксис для массива аргументов
Поддерживается с Java 5
int max(int[] numbers );
// usage: max(new int[] {1, 2, 3, 4});
int max(int ... numbers );
// usage: max(1, 2, 3, 4);
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 43 / 70
Система типов Java Ссылочные типы
Как сравнить два массива
a == b
сравнивает ссылки
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
Система типов Java Ссылочные типы
Как сравнить два массива
a == b
сравнивает ссылки
a.equals(b)
сравнивает ссылки
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
Система типов Java Ссылочные типы
Как сравнить два массива
a == b
сравнивает ссылки
a.equals(b)
сравнивает ссылки
Arrays.equals(a, b)
сравнивает содержимое
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
Система типов Java Ссылочные типы
Как сравнить два массива
a == b
сравнивает ссылки
a.equals(b)
сравнивает ссылки
Arrays.equals(a, b)
сравнивает содержимое
Arrays.deepEquals(a, b)
сравнивает содержимое многомерных массивов
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
Система типов Java Ссылочные типы
Как распечатать массив
System.out.println(a)
выводит «абракадабру» [I@2ce83912
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
Система типов Java Ссылочные типы
Как распечатать массив
System.out.println(a)
выводит «абракадабру» [I@2ce83912
System.out.println(Arrays.toString(a))
выводит содержимое
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
Система типов Java Ссылочные типы
Как распечатать массив
System.out.println(a)
выводит «абракадабру» [I@2ce83912
System.out.println(Arrays.toString(a))
выводит содержимое
System.out.println(Arrays.deepToString(a))
выводит содержимое многомерных массивов
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
Система типов Java Ссылочные типы
java.util.Arrays
copyOf, copyOfRange
fill
sort
binarySearch
java.lang.System.arraycopy
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 46 / 70
Система типов Java Ссылочные типы
Строки
Класс java.lang.String
Последовательность символов произвольной длины
в кодировке UTF-16
Строка — это не char[], хотя есть способы конвертации
Никаких нулевых символов в конце, длина хранится отдельно
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 47 / 70
Система типов Java Ссылочные типы
Создание строк
Строковые литералы
String zeros = "u0000u0000";
String hello = "Hello";
String specialChars = "rnt"";
String unicodeEscapes = "u0101u2134u03ff";
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70
Система типов Java Ссылочные типы
Создание строк
Строковые литералы
String zeros = "u0000u0000";
String hello = "Hello";
String specialChars = "rnt"";
String unicodeEscapes = "u0101u2134u03ff";
Создание из массива символов
char [] charArray = {’a’, ’b’, ’c’};
String string = new String(charArray );
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70
Система типов Java Ссылочные типы
Доступ к содержимому строки
Строки неизменяемы
int length()
char charAt(int index)
char[] toCharArray()
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 49 / 70
Система типов Java Ссылочные типы
Конкатенация строк
Оператор +
String helloWorld = "Hello" + " World!";
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70
Система типов Java Ссылочные типы
Конкатенация строк
Оператор +
String helloWorld = "Hello" + " World!";
java.lang.StringBuilder
StringBuilder buf = new StringBuilder ();
buf.append("Hello");
buf.append(" World!");
String result = buf.toString ();
Компилятор преобразует + в операции с StringBuilder
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70
Система типов Java Ссылочные типы
Сравнение строк
Оператор == сравнивает ссылки, а не содержимое строки
boolean equals(Object anObject)
boolean equalsIgnoreCase(String anotherString)
int compareTo(String anotherString)
int compareToIgnoreCase(String anotherString)
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 51 / 70
Управляющие конструкции Условные операторы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 52 / 70
Управляющие конструкции Условные операторы
Оператор if
if (weatherIsGood) {
walkInThePark ();
} else {
readBooksAtHome ();
}
Есть вариант без else
Условие типа boolean, нельзя написать if (i = 3) { ... }
Фигурные скобки рекомендуется ставить, даже когда они
необязательны
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 53 / 70
Управляющие конструкции Условные операторы
Оператор ?:
if (weatherIsGood) {
System.out.println("Weather is good");
} else {
System.out.println("Weather is bad");
}
// same effect , but much shorter
System.out.println("Weather is "
+ (weatherIsGood ? "good" : "bad"));
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 54 / 70
Управляющие конструкции Условные операторы
Оператор switch
switch (digit) {
case 0:
text = "zero";
break;
case 1:
text = "one";
break;
// case 2 - case 9
default:
text = "???";
}
Без break исполнение
продолжается
Работает для примитивных
типов byte, short, char, int,
а также для enum
В Java 7 добавлен switch
для String
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 55 / 70
Управляющие конструкции Условные операторы
if (digit == 0) {
text = "zero";
} else if (digit == 1) {
text = "one";
} else if (digit == 2) {
text = "two";
} /* 3 - 9 */
else {
text = "???";
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 56 / 70
Управляющие конструкции Циклы
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 57 / 70
Управляющие конструкции Циклы
Цикл while
while (haveTime () && haveMoney ()) {
goShopping ();
}
Цикл с предусловием
Условие типа boolean
Фигурные скобки рекомендуется ставить, даже когда они
необязательны
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 58 / 70
Управляющие конструкции Циклы
Цикл do while
do {
goShopping ();
} while (haveTime () && haveMoney ());
Цикл с постусловием
Нужна точка с запятой в конце
Фигурные скобки рекомендуется ставить, даже когда они
необязательны
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 59 / 70
Управляющие конструкции Циклы
Цикл for
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
Все части заголовка не обязательны
for (;;) — бесконечный цикл
Фигурные скобки рекомендуется ставить, даже когда они
необязательны
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 60 / 70
Управляющие конструкции Циклы
Цикл foreach
for (String arg : args) {
System.out.println(arg);
}
Добавлен в Java 5
Применим к массивам и классам, реализующим
интерфейс java.lang.Iterable
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 61 / 70
Управляющие конструкции Циклы
Оператор break
for (String s : haystack) {
if (needle.equals(s)) {
found = true;
break;
}
}
Передает управление на следующий за циклом оператор
Применим ко всем видам циклов
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 62 / 70
Управляющие конструкции Циклы
Оператор continue
for (String s : haystack) {
if (! needle.equals(s)) {
continue;
}
count ++;
}
Прерывает текущую итерацию цикла и начинает следующую
Перед новой итерацией проверяется условие цикла
Применим ко всем видам циклов
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 63 / 70
Управляющие конструкции Циклы
Метки
Операторы break и continue действуют на ближайший цикл
Можно указать другой цикл при помощи метки
outer:
for (int[] row : matrix) {
for (int x : row) {
if (x > 100) {
found = true;
break outer;
}
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 64 / 70
Примеры
public class Fibonacci {
public static long getFibonacciNumber (int n) {
if (n <= 0) {
return 0;
}
long prev = 0;
long curr = 1;
for (int i = 1; i < n; ++i) {
long next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
public static void main(String [] args) {
for (int i = 0; i <= Integer.parseInt(args [0]); ++i) {
System.out.printf("fib(%d) = %dn",
i, getFibonacciNumber (i));
}
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 65 / 70
Примеры
import java.math.BigInteger;
public class FibonacciBigInteger {
public static BigInteger getFibonacciNumber (int n) {
if (n <= 0) {
return BigInteger.ZERO;
}
BigInteger prev = BigInteger.ZERO;
BigInteger curr = BigInteger.ONE;
for (int i = 1; i < n; ++i) {
BigInteger next = prev.add(curr );
prev = curr;
curr = next;
}
return curr;
}
public static void main(String [] args) {
for (int i = 0; i <= Integer.parseInt(args [0]); ++i) {
System.out.printf("fib(%d) = %dn",
i, getFibonacciNumber (i));
}
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 66 / 70
Примеры
import java.util.Arrays;
public class Anagrams {
public static boolean areAnagrams (String a, String b) {
char [] charsFromA = getSortedChars (a);
char [] charsFromB = getSortedChars (b);
return Arrays.equals(charsFromA , charsFromB );
}
private static char [] getSortedChars (String s) {
char [] chars = s. toCharArray ();
Arrays.sort(chars );
return chars;
}
public static void main(String [] args) {
System.out.println(areAnagrams ("silent", "listen")
? "anagrams"
: "not anagrams");
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 67 / 70
Примеры
public class Palindromes {
public static boolean isPalindrome (String s) {
String normalizedText = normalize(s);
return normalizedText .equals(reverse( normalizedText ));
}
private static String normalize(String s) {
return s. toLowerCase (). replaceAll("W+", "");
}
private static String reverse(String s) {
return new StringBuilder (s). reverse (). toString ();
}
public static void main(String [] args) {
System.out.println( isPalindrome ("Madam , I’m Adam")
? "palindrome" : "not palindrome");
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 68 / 70
Примеры
public class Polygons {
public static double getArea(double [][] polygon) {
int size = polygon.length;
double sum = 0;
for (int i = 0; i < size; ++i) {
int j = (i + 1) % size;
sum += det(polygon[i][0] , polygon[i][1] ,
polygon[j][0] , polygon[j][1]);
}
return Math.abs(sum / 2);
}
private static double det(double x1 , double y1 ,
double x2 , double y2) {
return x1 * y2 - x2 * y1;
}
public static void main(String [] args) {
double [][] polygon = new double [][] {
{1, 1}, {1, 2}, {2, 2}, {2, 1}};
System.out.printf(
"Polygon area = %1.3fn", getArea(polygon ));
}
}
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 69 / 70
Что сегодня узнали
Что такое «примитивные» и «ссылочные типы»
Как на Java производить логические и арифметические
вычисления
Какие есть подводные камни
Как создавать и использовать массивы
Как создавать и использовать строки
Как в Java написать ветвление и цикл,
какие есть разновидности
Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 70 / 70

More Related Content

Viewers also liked

07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
Roman Brovko
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
Roman Brovko
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
Roman Brovko
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
Roman Brovko
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
Roman Brovko
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
Roman Brovko
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
Roman Brovko
 
03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты
Roman Brovko
 
DFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данныхDFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данных
Timofei Tatarinov
 

Viewers also liked (9)

07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
 
03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты
 
DFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данныхDFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данных
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
Roman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
Roman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

02 - Java. Базовый синтаксис Java

  • 1. Базовый синтаксис Java Алексей Владыкин 15 сентября 2014 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 1 / 70
  • 2. 1 Система типов Java Примитивные типы Преобразование типов Ссылочные типы 2 Управляющие конструкции Условные операторы Циклы 3 Примеры Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 2 / 70
  • 3. Система типов Java Примитивные типы boolean char byte, short, int, long float, double Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70
  • 4. Система типов Java Примитивные типы boolean char byte, short, int, long float, double Зарезервированные ключевые слова языка Не имеют полей и методов Передаются по значению Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 3 / 70
  • 5. Система типов Java Ссылочные типы Все остальные Являются объектами (наследуют java.lang.Object) Имеют поля и методы Передаются по ссылке Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 4 / 70
  • 6. Система типов Java Примитивные типы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 5 / 70
  • 7. Система типов Java Примитивные типы Тип boolean Литералы: false, true Результат любого сравнения — boolean: < > == <= >= != Нет преобразования между boolean и другими примитивными типами Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 6 / 70
  • 8. Система типов Java Примитивные типы Логические операции and && & &= or || | |= xor ˆ ˆ= not ! Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70
  • 9. Система типов Java Примитивные типы Логические операции and && & &= or || | |= xor ˆ ˆ= not ! && и || — вычисление по сокращенной схеме & и | — вычисление по полной схеме Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 7 / 70
  • 10. Система типов Java Примитивные типы java.lang.Boolean Класс-обертка для boolean boolean parseBoolean(String) String toString(boolean) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 8 / 70
  • 11. Система типов Java Примитивные типы Тип char Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 9 / 70
  • 12. Система типов Java Примитивные типы Символьные значения char — 16 бит, беззнаковый Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
  • 13. Система типов Java Примитивные типы Символьные значения char — 16 бит, беззнаковый (0 .. 216 − 1) Представляет номер символа в кодировке Unicode Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
  • 14. Система типов Java Примитивные типы Символьные значения char — 16 бит, беззнаковый (0 .. 216 − 1) Представляет номер символа в кодировке Unicode Литералы: символ в одинарных кавычках: ’a’ шестнадцатеричный код символа: ’u78bc’ спецпоследовательности: ’t’, ’n’, ’r’, ’”, ’’ Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
  • 15. Система типов Java Примитивные типы Символьные значения char — 16 бит, беззнаковый (0 .. 216 − 1) Представляет номер символа в кодировке Unicode Литералы: символ в одинарных кавычках: ’a’ шестнадцатеричный код символа: ’u78bc’ спецпоследовательности: ’t’, ’n’, ’r’, ’”, ’’ Свободно конвертируется в числовые типы и обратно Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 10 / 70
  • 16. Система типов Java Примитивные типы Суррогаты В современном Unicode больше символов, чем влезает в 16 бит Поэтому некоторые Unicode-сиволы в Java представляются двумя char’ами — суррогатной парой Такие символы можно хранить и в int Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 11 / 70
  • 17. Система типов Java Примитивные типы java.lang.Character Класс-обертка для char char toLowerCase(char) char toUpperCase(char) boolean isLowerCase(char) boolean isUpperCase(char) boolean isDigit(char) boolean isLetter(char) boolean isHighSurrogate(char) boolean isLowSurrogate(char) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 12 / 70
  • 18. Система типов Java Примитивные типы Целочисленные типы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 13 / 70
  • 19. Система типов Java Примитивные типы Диапазоны значений Тип Бит Диапазон byte 8 −128 .. + 127 short 16 −215 .. + 215 − 1 int 32 −231 .. + 231 − 1 long 64 −263 .. + 263 − 1 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70
  • 20. Система типов Java Примитивные типы Диапазоны значений Тип Бит Диапазон byte 8 −128 .. + 127 short 16 −215 .. + 215 − 1 int 32 −231 .. + 231 − 1 long 64 −263 .. + 263 − 1 Размер фиксирован, одинаков для всех платформ Все типы знаковые, беззнаковых вариантов нет Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 14 / 70
  • 21. Система типов Java Примитивные типы Литералы Десятичное число: 123 Восьмеричное число: 0123 Шестнадцатеричное число: 0x123 Двоичное число: 0b101 (с Java 7) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70
  • 22. Система типов Java Примитивные типы Литералы Десятичное число: 123 Восьмеричное число: 0123 Шестнадцатеричное число: 0x123 Двоичное число: 0b101 (с Java 7) С подчеркиванием: 123_456_789 (с Java 7) С суффиксом L для long Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 15 / 70
  • 23. Система типов Java Примитивные типы Арифметические операции сложение + += вычитание - -= умножение * *= деление / /= остаток % %= инкремент ++ декремент -- Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70
  • 24. Система типов Java Примитивные типы Арифметические операции сложение + += вычитание - -= умножение * *= деление / /= остаток % %= инкремент ++ декремент -- Деление целочисленное Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 16 / 70
  • 25. Система типов Java Примитивные типы Особые случаи Деление на ноль — исключительная ситуация, бросается ArithmeticException Переполнение не является исключительной ситуацией, лишние старшие биты просто выкидываются Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 17 / 70
  • 26. Система типов Java Примитивные типы Побитовые операции not ~ and & &= or | |= xor ˆ ˆ= shr >> >>= shr’ >>> >>>= shl << <<= Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70
  • 27. Система типов Java Примитивные типы Побитовые операции not ~ and & &= or | |= xor ˆ ˆ= shr >> >>= shr’ >>> >>>= shl << <<= >> — арифметический сдвиг >>> — логический сдвиг Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 18 / 70
  • 28. Система типов Java Примитивные типы Классы-обертки java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long MIN_VALUE MAX_VALUE toString(typename) parseTypename(String) bitCount(typename) reverse(typename) reverseBytes(typename) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 19 / 70
  • 29. Система типов Java Примитивные типы Вещественные типы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 20 / 70
  • 30. Система типов Java Примитивные типы Стандарт IEEE754 Число в представлено в виде ±m · 2e Тип Бит Знак Мантисса Экспонента float 32 1 23 8 double 64 1 52 11 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 21 / 70
  • 31. Система типов Java Примитивные типы Литералы Обычная запись: -1.234 Экспоненциальная запись: -123.4e-2 (−123.4 · 10−2) Шестнадцатеричная запись: 0xFFFFpFF (FFFF · 2FF ) С суффиксом типа: 38f 3e19d 123.4e-2f 444.444d Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 22 / 70
  • 32. Система типов Java Примитивные типы Операции сложение + += вычитание - -= умножение * *= деление / /= остаток % %= инкремент ++ декремент -- Побитовые операции не поддерживаются Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 23 / 70
  • 33. Система типов Java Примитивные типы Особые случаи Деление положительного числа на 0 дает +∞ Деление отрицательного числа на 0 дает −∞ Деление 0 на 0 дает NaN Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
  • 34. Система типов Java Примитивные типы Особые случаи Деление положительного числа на 0 дает +∞ Деление отрицательного числа на 0 дает −∞ Деление 0 на 0 дает NaN Переполнение дает +∞ или −∞, в зависимости от направления Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
  • 35. Система типов Java Примитивные типы Особые случаи Деление положительного числа на 0 дает +∞ Деление отрицательного числа на 0 дает −∞ Деление 0 на 0 дает NaN Переполнение дает +∞ или −∞, в зависимости от направления Любая арифметическая операция с NaN дает NaN NaN != NaN Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 24 / 70
  • 36. Система типов Java Примитивные типы strictfp Java использует FPU для вычислений с плавающей точкой Регистры FPU могут быть шире 64 бит Результаты вычислений могут отличаться Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70
  • 37. Система типов Java Примитивные типы strictfp Java использует FPU для вычислений с плавающей точкой Регистры FPU могут быть шире 64 бит Результаты вычислений могут отличаться Модификатор strictfp включает режим строгой совместимости, результаты будут идентичны на любом процессоре Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 25 / 70
  • 38. Система типов Java Примитивные типы Классы-обертки java.lang.Float java.lang.Double MIN_VALUE MAX_VALUE POSITIVE_INFINITY NEGATIVE_INFINITY NaN boolean isNaN(typename) toString(typename) parseTypename(String) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 26 / 70
  • 39. Система типов Java Примитивные типы java.lang.Math константы: E, PI тригонометрия: sin, cos степени: sqrt, pow, exp min, max . . . Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 27 / 70
  • 40. Система типов Java Преобразование типов Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 28 / 70
  • 41. Система типов Java Преобразование типов Неявное преобразование типов Преобразование целочисленных типов в более емкие (byte → short → int → long) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
  • 42. Система типов Java Преобразование типов Неявное преобразование типов Преобразование целочисленных типов в более емкие (byte → short → int → long) Преобразование char в int и long Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
  • 43. Система типов Java Преобразование типов Неявное преобразование типов Преобразование целочисленных типов в более емкие (byte → short → int → long) Преобразование char в int и long Преобразование целочисленные типов в типы с плавающей точкой (возможна потеря точности) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 29 / 70
  • 44. Система типов Java Преобразование типов Явное преобразование типов Оператор приведения типа: (typename) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
  • 45. Система типов Java Преобразование типов Явное преобразование типов Оператор приведения типа: (typename) При приведении более емкого целого типа к менее емкому старшие биты просто отбрасываются Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
  • 46. Система типов Java Преобразование типов Явное преобразование типов Оператор приведения типа: (typename) При приведении более емкого целого типа к менее емкому старшие биты просто отбрасываются При приведении типа с плавающей точкой к целому типу дробная часть отбрасывается (никакого округления) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
  • 47. Система типов Java Преобразование типов Явное преобразование типов Оператор приведения типа: (typename) При приведении более емкого целого типа к менее емкому старшие биты просто отбрасываются При приведении типа с плавающей точкой к целому типу дробная часть отбрасывается (никакого округления) Слишком большое дробное число при приведении к целому превращается в MAX_VALUE или MIN_VALUE Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
  • 48. Система типов Java Преобразование типов Явное преобразование типов Оператор приведения типа: (typename) При приведении более емкого целого типа к менее емкому старшие биты просто отбрасываются При приведении типа с плавающей точкой к целому типу дробная часть отбрасывается (никакого округления) Слишком большое дробное число при приведении к целому превращается в MAX_VALUE или MIN_VALUE Слишком большой double при приведении к float превращается в Float.POSITIVE_INFINITY или Float.NEGATIVE_INFINITY Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 30 / 70
  • 49. Система типов Java Преобразование типов Автоматическое расширение При вычислении выражения (a @ b) аргументы a и b преобразовываются в числа, имеющие одинаковый тип: если одно из чисел double, то в double; иначе, если одно из чисел float, то в float; иначе, если одно из чисел long, то в long; иначе оба числа преобразуются в int. byte b = 1; byte c = b + 1; // compilation error Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 31 / 70
  • 50. Система типов Java Преобразование типов Неявное приведение с потерей данных Сокращенная запись var @= expr раскрывается в var = (typename) (var @ (expr)) Неявно срабатывает приведение типа, в том числе с потерей данных short n = -1; while (n != 0) { n >>>= 1; } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 32 / 70
  • 51. Система типов Java Преобразование типов Boxing/unboxing Autoboxing: примитивное значение → объект-обертка Autounboxing: объект-обертка → примитивное значение Integer i = 1; Integer j = i + 1; int k = i + j; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 33 / 70
  • 52. Система типов Java Ссылочные типы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 34 / 70
  • 53. Система типов Java Ссылочные типы Ссылочные типы Все остальные, кроме примитивных Передаются по ссылке Являются объектами (наследуют java.lang.Object) Имеют поля и методы Ссылка может принимать значение null Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 35 / 70
  • 54. Система типов Java Ссылочные типы Массивы Массив обозначается квадратными скобками int[] numbers; String [] args; boolean bits []; char [] letters , digits; float rates[], maxRate; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 36 / 70
  • 55. Система типов Java Ссылочные типы Создание Массив создается оператором new Все элементы массива инициализируются нулями Размер массива фиксируется в момент создания int[] numbers = new int [100]; String [] args = new String [1]; boolean [] bits = new boolean [0]; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 37 / 70
  • 56. Система типов Java Ссылочные типы Инициализация Можно перечислить значения всех элементов при создании массива int[] numbers = new int[] {1, 2, 3, 4, 5}; boolean [] bits = new boolean [] {true , true , false }; // this works only in variable declaration char [] digits = { ’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’}; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 38 / 70
  • 57. Система типов Java Ссылочные типы Индексация Элементы индексируются с нуля Длина массива доступна как array.length При выходе за границы массива бросается исключение int[] numbers = {1, 2, 3, 4, 5}; // numbers.length -> 5 // numbers [0] -> 1 // numbers [1] -> 2 // numbers [4] -> 5 // numbers [5] -> ArrayIndexOutOfBoundsException Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 39 / 70
  • 58. Система типов Java Ссылочные типы Многомерные массивы Многомерный массив — это массив массивов int [][] matrix0; int [][] matrix1 = new int [2][2]; int [][] matrix2 = {{1, 2}, {3, 4}}; int[] row = matrix2 [0] // matrix2 [1][1] -> 4 // row [0] -> 1 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 40 / 70
  • 59. Система типов Java Ссылочные типы Многомерные массивы Разрешены ступенчатые массивы int [][] triangle = { {1, 2, 3, 4, 5}, {6, 7, 8, 9}, {10, 11, 12}, {13, 14}, {15}}; // triangle.length -> 5 // triangle [0]. length -> 5 // triangle [4]. length -> 1 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 41 / 70
  • 60. Система типов Java Ссылочные типы Представление в памяти Одномерный массив занимает непрерывный участок памяти Двумерный массив занимает n + 1 участок в памяти, где n — первая размерность int [][] a = new int [10][1000]; int [][] b = new int [1000][10]; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 42 / 70
  • 61. Система типов Java Ссылочные типы Varargs Специальный синтаксис для массива аргументов Поддерживается с Java 5 int max(int[] numbers ); // usage: max(new int[] {1, 2, 3, 4}); int max(int ... numbers ); // usage: max(1, 2, 3, 4); Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 43 / 70
  • 62. Система типов Java Ссылочные типы Как сравнить два массива a == b сравнивает ссылки Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
  • 63. Система типов Java Ссылочные типы Как сравнить два массива a == b сравнивает ссылки a.equals(b) сравнивает ссылки Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
  • 64. Система типов Java Ссылочные типы Как сравнить два массива a == b сравнивает ссылки a.equals(b) сравнивает ссылки Arrays.equals(a, b) сравнивает содержимое Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
  • 65. Система типов Java Ссылочные типы Как сравнить два массива a == b сравнивает ссылки a.equals(b) сравнивает ссылки Arrays.equals(a, b) сравнивает содержимое Arrays.deepEquals(a, b) сравнивает содержимое многомерных массивов Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 44 / 70
  • 66. Система типов Java Ссылочные типы Как распечатать массив System.out.println(a) выводит «абракадабру» [I@2ce83912 Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
  • 67. Система типов Java Ссылочные типы Как распечатать массив System.out.println(a) выводит «абракадабру» [I@2ce83912 System.out.println(Arrays.toString(a)) выводит содержимое Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
  • 68. Система типов Java Ссылочные типы Как распечатать массив System.out.println(a) выводит «абракадабру» [I@2ce83912 System.out.println(Arrays.toString(a)) выводит содержимое System.out.println(Arrays.deepToString(a)) выводит содержимое многомерных массивов Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 45 / 70
  • 69. Система типов Java Ссылочные типы java.util.Arrays copyOf, copyOfRange fill sort binarySearch java.lang.System.arraycopy Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 46 / 70
  • 70. Система типов Java Ссылочные типы Строки Класс java.lang.String Последовательность символов произвольной длины в кодировке UTF-16 Строка — это не char[], хотя есть способы конвертации Никаких нулевых символов в конце, длина хранится отдельно Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 47 / 70
  • 71. Система типов Java Ссылочные типы Создание строк Строковые литералы String zeros = "u0000u0000"; String hello = "Hello"; String specialChars = "rnt""; String unicodeEscapes = "u0101u2134u03ff"; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70
  • 72. Система типов Java Ссылочные типы Создание строк Строковые литералы String zeros = "u0000u0000"; String hello = "Hello"; String specialChars = "rnt""; String unicodeEscapes = "u0101u2134u03ff"; Создание из массива символов char [] charArray = {’a’, ’b’, ’c’}; String string = new String(charArray ); Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 48 / 70
  • 73. Система типов Java Ссылочные типы Доступ к содержимому строки Строки неизменяемы int length() char charAt(int index) char[] toCharArray() String substring(int beginIndex) String substring(int beginIndex, int endIndex) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 49 / 70
  • 74. Система типов Java Ссылочные типы Конкатенация строк Оператор + String helloWorld = "Hello" + " World!"; Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70
  • 75. Система типов Java Ссылочные типы Конкатенация строк Оператор + String helloWorld = "Hello" + " World!"; java.lang.StringBuilder StringBuilder buf = new StringBuilder (); buf.append("Hello"); buf.append(" World!"); String result = buf.toString (); Компилятор преобразует + в операции с StringBuilder Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 50 / 70
  • 76. Система типов Java Ссылочные типы Сравнение строк Оператор == сравнивает ссылки, а не содержимое строки boolean equals(Object anObject) boolean equalsIgnoreCase(String anotherString) int compareTo(String anotherString) int compareToIgnoreCase(String anotherString) Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 51 / 70
  • 77. Управляющие конструкции Условные операторы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 52 / 70
  • 78. Управляющие конструкции Условные операторы Оператор if if (weatherIsGood) { walkInThePark (); } else { readBooksAtHome (); } Есть вариант без else Условие типа boolean, нельзя написать if (i = 3) { ... } Фигурные скобки рекомендуется ставить, даже когда они необязательны Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 53 / 70
  • 79. Управляющие конструкции Условные операторы Оператор ?: if (weatherIsGood) { System.out.println("Weather is good"); } else { System.out.println("Weather is bad"); } // same effect , but much shorter System.out.println("Weather is " + (weatherIsGood ? "good" : "bad")); Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 54 / 70
  • 80. Управляющие конструкции Условные операторы Оператор switch switch (digit) { case 0: text = "zero"; break; case 1: text = "one"; break; // case 2 - case 9 default: text = "???"; } Без break исполнение продолжается Работает для примитивных типов byte, short, char, int, а также для enum В Java 7 добавлен switch для String Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 55 / 70
  • 81. Управляющие конструкции Условные операторы if (digit == 0) { text = "zero"; } else if (digit == 1) { text = "one"; } else if (digit == 2) { text = "two"; } /* 3 - 9 */ else { text = "???"; } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 56 / 70
  • 82. Управляющие конструкции Циклы Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 57 / 70
  • 83. Управляющие конструкции Циклы Цикл while while (haveTime () && haveMoney ()) { goShopping (); } Цикл с предусловием Условие типа boolean Фигурные скобки рекомендуется ставить, даже когда они необязательны Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 58 / 70
  • 84. Управляющие конструкции Циклы Цикл do while do { goShopping (); } while (haveTime () && haveMoney ()); Цикл с постусловием Нужна точка с запятой в конце Фигурные скобки рекомендуется ставить, даже когда они необязательны Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 59 / 70
  • 85. Управляющие конструкции Циклы Цикл for for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } Все части заголовка не обязательны for (;;) — бесконечный цикл Фигурные скобки рекомендуется ставить, даже когда они необязательны Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 60 / 70
  • 86. Управляющие конструкции Циклы Цикл foreach for (String arg : args) { System.out.println(arg); } Добавлен в Java 5 Применим к массивам и классам, реализующим интерфейс java.lang.Iterable Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 61 / 70
  • 87. Управляющие конструкции Циклы Оператор break for (String s : haystack) { if (needle.equals(s)) { found = true; break; } } Передает управление на следующий за циклом оператор Применим ко всем видам циклов Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 62 / 70
  • 88. Управляющие конструкции Циклы Оператор continue for (String s : haystack) { if (! needle.equals(s)) { continue; } count ++; } Прерывает текущую итерацию цикла и начинает следующую Перед новой итерацией проверяется условие цикла Применим ко всем видам циклов Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 63 / 70
  • 89. Управляющие конструкции Циклы Метки Операторы break и continue действуют на ближайший цикл Можно указать другой цикл при помощи метки outer: for (int[] row : matrix) { for (int x : row) { if (x > 100) { found = true; break outer; } } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 64 / 70
  • 90. Примеры public class Fibonacci { public static long getFibonacciNumber (int n) { if (n <= 0) { return 0; } long prev = 0; long curr = 1; for (int i = 1; i < n; ++i) { long next = prev + curr; prev = curr; curr = next; } return curr; } public static void main(String [] args) { for (int i = 0; i <= Integer.parseInt(args [0]); ++i) { System.out.printf("fib(%d) = %dn", i, getFibonacciNumber (i)); } } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 65 / 70
  • 91. Примеры import java.math.BigInteger; public class FibonacciBigInteger { public static BigInteger getFibonacciNumber (int n) { if (n <= 0) { return BigInteger.ZERO; } BigInteger prev = BigInteger.ZERO; BigInteger curr = BigInteger.ONE; for (int i = 1; i < n; ++i) { BigInteger next = prev.add(curr ); prev = curr; curr = next; } return curr; } public static void main(String [] args) { for (int i = 0; i <= Integer.parseInt(args [0]); ++i) { System.out.printf("fib(%d) = %dn", i, getFibonacciNumber (i)); } } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 66 / 70
  • 92. Примеры import java.util.Arrays; public class Anagrams { public static boolean areAnagrams (String a, String b) { char [] charsFromA = getSortedChars (a); char [] charsFromB = getSortedChars (b); return Arrays.equals(charsFromA , charsFromB ); } private static char [] getSortedChars (String s) { char [] chars = s. toCharArray (); Arrays.sort(chars ); return chars; } public static void main(String [] args) { System.out.println(areAnagrams ("silent", "listen") ? "anagrams" : "not anagrams"); } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 67 / 70
  • 93. Примеры public class Palindromes { public static boolean isPalindrome (String s) { String normalizedText = normalize(s); return normalizedText .equals(reverse( normalizedText )); } private static String normalize(String s) { return s. toLowerCase (). replaceAll("W+", ""); } private static String reverse(String s) { return new StringBuilder (s). reverse (). toString (); } public static void main(String [] args) { System.out.println( isPalindrome ("Madam , I’m Adam") ? "palindrome" : "not palindrome"); } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 68 / 70
  • 94. Примеры public class Polygons { public static double getArea(double [][] polygon) { int size = polygon.length; double sum = 0; for (int i = 0; i < size; ++i) { int j = (i + 1) % size; sum += det(polygon[i][0] , polygon[i][1] , polygon[j][0] , polygon[j][1]); } return Math.abs(sum / 2); } private static double det(double x1 , double y1 , double x2 , double y2) { return x1 * y2 - x2 * y1; } public static void main(String [] args) { double [][] polygon = new double [][] { {1, 1}, {1, 2}, {2, 2}, {2, 1}}; System.out.printf( "Polygon area = %1.3fn", getArea(polygon )); } } Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 69 / 70
  • 95. Что сегодня узнали Что такое «примитивные» и «ссылочные типы» Как на Java производить логические и арифметические вычисления Какие есть подводные камни Как создавать и использовать массивы Как создавать и использовать строки Как в Java написать ветвление и цикл, какие есть разновидности Алексей Владыкин Базовый синтаксис Java 15 сентября 2014 70 / 70