Лексика языка Java

Содержание

Слайд 2

План лекции Основы лексики Java Типы данных и литералы Операторы Работа со строками и массивами Инструкции

План лекции

Основы лексики Java
Типы данных и литералы
Операторы
Работа со строками и массивами
Инструкции

Слайд 3

Кодировка Java ориентирован на Unicode Первые 128 символов почти идентичны набору

Кодировка

Java ориентирован на Unicode
Первые 128 символов почти идентичны набору ASCII
Символы Unicode

задаются с помощью escape-последовательностей \u262f, \uu2042, \uuu203d
Java чувствителен к регистру!
Слайд 4

Исходный код Исходный код разделяется на: Пробелы ASCII-символ SP, \u0020, дес.

Исходный код

Исходный код разделяется на:
Пробелы
ASCII-символ SP, \u0020, дес. код 32
ASCII-символ HT,

\u0009, дес. код 9
ASCII-символ FF, \u000c, дес. код 12
ASCII-символ LF, символ новой строки
ASCII-символ CR, возврат каретки
символ CR, за которым сразу следует символ LF
Комментарии
Лексемы
Слайд 5

Комментарии // Комментарий Символы после // и до конца текущей строки

Комментарии

// Комментарий Символы после // и до конца текущей строки игнорируются
/* Комментарий

*/ Все символы, заключенные между /* и */, игнорируются
/** Комментарий */ Комментарии документирования
Слайд 6

Комментарии документирования (javadoc) Начинаются с /**, заканчиваются */ В строках начальные

Комментарии документирования (javadoc)

Начинаются с /**, заканчиваются */
В строках начальные символы *

и пробелы перед ними игнорируются
Допускают использование HTML-тэгов, кроме заголовков
Специальные тэги @see, @param, @deprecated
Слайд 7

Комментарии документирования (javadoc)

Комментарии документирования (javadoc)

Слайд 8

Лексемы Идентификаторы Служебные слова class, public, const, goto, и т.д. Литералы

Лексемы

Идентификаторы
Служебные слова class, public, const, goto, и т.д.
Литералы
Разделители { } [ ] (

) ; . ,
Операторы = > < ! ? : == && ||
Слайд 9

Типы данных Ссылочные Предназначены для работы с объектами Переменные содержат ссылки

Типы данных

Ссылочные
Предназначены для работы с объектами
Переменные содержат ссылки на объекты
Ссылка –

это не указатель!
Тип переменной определяет контракт доступа к объекту
Примитивные (простые)
Предназначены для работы со значениями естественных, простых типов
Переменные содержат непосредственно значения
Слайд 10

Типы данных Тип данных определяется следующими характеристиками: Множество значений для примитивных

Типы данных

Тип данных определяется следующими характеристиками:
Множество значений
для примитивных типов – числа,

не выходящие за диапазон типа
для ссылочных типов – ссылки на объекты, контракт которых включает в себя контракт, определяемый типом ссылки
Возможные операции со значениями
для примитивных типов – операторы
для ссылочных типов – действия, входящие в контракт типа (вызов методов и обращение к полям), и операторы
Форма хранения и представления
форма хранения определяется реализацией JVM
JVM гарантирует одинаковое представление, не зависящее от реализации
Слайд 11

Переменные Именованные участки памяти, способные содержать значения определенного типа Могут быть

Переменные

Именованные участки памяти, способные содержать значения определенного типа
Могут быть объявлены в

различных частях кода
поля объектов
поля классов (статические поля)
параметры методов
локальные переменные методов и блоков инициализации
Объявление переменной состоит из наименования типа, идентификатора и инициализации
Область видимости переменной определяется местом ее объявления
Локальные переменные должны быть инициализированы перед их использованием
Слайд 12

Ссылочные типы К ссылочным типам относятся типы классов (в т.ч. массивов)

Ссылочные типы

К ссылочным типам относятся типы классов (в т.ч. массивов) и

интерфейсов
Переменная ссылочного типа способна содержать ссылку на объект, относящийся к этому типу
Ссылочный литерал null
Слайд 13

Примитивные типы Булевский (логический) тип boolean – допускает хранение значений true

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

Булевский (логический) тип
boolean – допускает хранение значений true или false
Целочисленные

типы
char – 16-битовый символ Unicode
byte – 8-битовое целое число со знаком
short – 16-битовое целое число со знаком
int – 32-битовое целое число со знаком
long – 64-битовое целое число со знаком
Вещественные типы
float – 32-битовое число с плавающей точкой (IEEE 754-1985)
double – 64-битовое число с плавающей точкой (IEEE 754-1985)
Слайд 14

Литералы Булевы true false Символьные 'a' '\n' '\\' '\377' '\u0064' Целочисленные

Литералы

Булевы true false
Символьные 'a' '\n' '\\' '\377' '\u0064'
Целочисленные 29 035 0x1D 0X1d 0xffffL
По умолчанию

имеют тип int
Числовые с плавающей запятой 1. .1 1e1 1e-4D 1e+5f
По умолчанию имеют тип double
Строковые "Это строковый литерал" ""
Слайд 15

Бинарные литералы (Java 7) Префиксы 0b 0B Полезны при работе с

Бинарные литералы (Java 7)

Префиксы
0b
0B
Полезны при работе с битовыми представлениями чисел, поскольку

позволяют лучше видеть:
саму структуру числа 0b0000111111110000 // 2040, 0x07f8
взаимосвязь чисел 0b0000111111111111 // 4095, 0x0fff 0b1111000000000000 // 61440, 0xf000
Слайд 16

Подчеркивание в числовых литералах (Java7) Можно использовать В литералах любых числовых

Подчеркивание в числовых литералах (Java7)

Можно использовать
В литералах любых числовых типов 765_324_213_434L
В литералах

в любых системах счисления 0xFF_00_FF_00
В нужных местах числа 1_23_456_7890
В нужном количестве 6_____6
Слайд 17

Подчеркивание в числовых литералах (Java7) Нельзя использовать В начале и в

Подчеркивание в числовых литералах (Java7)

Нельзя использовать
В начале и в конце числа _123 123_
Рядом

с разделителем целой и дробной части 10_.01 10._01
Перед суффиксами L, F и D 1_L 1.1_F 1.1_D
В строковых литералах с числами "6_____6"
Слайд 18

Константы Констант как особого вида переменных и полей в Java нет

Константы

Констант как особого вида переменных и полей в Java нет
Если необходима

константа в методе, то переменная при объявлении снабжается модификатором final
Так можно сделать даже с параметром метода
Это не имеет особого смысла
Но иногда это явно требуется в многопоточных программах
Если необходима общедоступная константа, то создаётся поле с модификаторами public static final
Такие поля и называют константами (условно)
Их имена записываются заглавными буквами
Обращение чаще всего происходит через имя класса, например BigInteger.ZERO
Слайд 19

Операторы Постфиксные Унарные Создание и приведение Арифметика Арифметика Побитовый сдвиг Сравнение

Операторы

Постфиксные
Унарные
Создание и приведение
Арифметика
Арифметика
Побитовый сдвиг
Сравнение
Равенство
И (and)
Исключающее ИЛИ (xor)
Включающее ИЛИ (or)
Условное

И (and)
Условное ИЛИ (or)
Условный оператор
Операторы присваивания

[] . (params) expr++ expr--
++expr --expr +expr –expr ~ !
new (type)expr
* / %
+ -
<< >> >>>
< > >= <= instanceof
== !=
&
^
|
&&
||
? :
= += -= *= /= %= >>= <<= >>>= &= ^= |=

приоритет

высокий

низкий

Слайд 20

Арифметические операторы примитивных числовых типов Арифметические операции + – сложение двух

Арифметические операторы примитивных числовых типов

Арифметические операции
+ – сложение двух значений
- –

вычитание второго значения из первого
* – умножение двух значений
/ – деление первого значения на второе
% – остаток от деления первого значения на второе
Результат имеет тип, совпадающий с «наиболее широким» типом из типов операндов, но не меньше, чем int
Слайд 21

Особенность примитивных вещественных типов Легальные значения Positive Infinity (Infinity) Negative Infinity

Особенность примитивных вещественных типов

Легальные значения
Positive Infinity (Infinity)
Negative Infinity (-Infinity)
Not a Number

(NaN)
Различаются значения 0, +0 и -0

int a = 5, b = 0;
int c = a / b;
System.out.println(c);

float a = 5, b = 0;
float c = a / b;
System.out.println(c);

Exception in thread "main" java.lang.ArithmeticException

Infinity

Слайд 22

Арифметические операторы примитивных числовых типов Инкременты и декременты – соответственно, увеличивают

Арифметические операторы примитивных числовых типов

Инкременты и декременты – соответственно, увеличивают и

уменьшают значение на 1
Постфиксная форма: i++, i-- результатом оператора является прежнее (неизмененное) значение
Префиксная форма: ++i, --i результатом оператора является новое значение
Унарные + и -
Аналогичны случаю, когда первый операнд равен 0
Если знак + или - находится перед литералом, он может трактоваться как часть литерала
Слайд 23

Побитовые операторы примитивных целых типов Логические операторы & – «и» (and)

Побитовые операторы примитивных целых типов

Логические операторы
& – «и» (and) 1 &

3 -> 1 00000001 & 00000011 -> 00000001
| – «или» (or) 1 | 3 -> 3 00000001 | 00000011 -> 00000011
^ – «исключающее или» (xor) 1 ^ 3 -> 2 00000001 ^ 00000011 -> 00000010
~ – побитовое отрицание ~ 1 -> -2 ~00000001 -> 11111110
Вычисления производятся в типе int либо long
Слайд 24

Побитовые операторы примитивных целых типов Операторы сдвига 4 00000001 00000100 >>

Побитовые операторы примитивных целых типов

Операторы сдвига
<< – сдвиг влево 1 <<

2 -> 4 00000001 << 2 -> 00000100
>> – арифметический сдвиг вправо 4 >> 2 -> 1 00000100 >> 2 -> 00000001 -1 >> 2 -> -1 11111111 >> 2 -> 11111111
>>> – логический сдвиг вправо 4 >>> 2 -> 1 00000100 >>> 2 -> 00000001 -1 >>> 2 -> 1073741823 11111111 >>> 2 -> 00111111 11111111 11111111 11111111
Вычисления производятся в типе int либо long
Слайд 25

Побитовые операторы примитивных целых типов

Побитовые операторы примитивных целых типов

Слайд 26

Операторы сравнения примитивных числовых типов > и >= и == –

Операторы сравнения примитивных числовых типов

> и < – строгое сравнение
>= и

<= – нестрогое сравнение
== – определение равенства
!= – определение неравенства
Результат – логическое значение: true или false
Сравнение проводится в наиболее широком типе из типов операндов
Слайд 27

Операторы примитивного логического типа == – определение равенства != – определение

Операторы примитивного логического типа

== – определение равенства
!= – определение неравенства
! –

отрицание
& – логическое «и» (and)
| – логическое «или» (or)
^ – логическое «исключающее или» (xor)
&& – условное «и»
(может не вычислять второй операнд)
|| – условное «или»
(может не вычислять второй операнд)
Слайд 28

Операторы присваивания примитивных типов = – простое присваивание Тип выражения справа

Операторы присваивания примитивных типов

= – простое присваивание
Тип выражения справа должен допускать

присваивание в переменную слева
+=, -=, *=, /=, %=, >>=, <<=, >>>=, &=, ^=, |=
Присваивание с действием
Выражение a ?= b эквивалентно a = a ? b, но выполняется быстрее
Типы операндов должны позволять совершить операцию
Слайд 29

Преобразование примитивных числовых типов Неявное преобразование типов Преобразование к более широкому

Преобразование примитивных числовых типов

Неявное преобразование типов Преобразование к более широкому типу
Явное преобразование

типов Преобразование к указанному типу с помощью оператора (type)expr

short s1 = 29;
int i1 = s1;
float f1 = i1;
int i2 = 14;
short s2 = (short) i2;
short s = -134;
byte b = (byte) s; // b = 122;

Слайд 30

Особенности преобразования примитивных числовых типов Более широким считается тип, переменные которого

Особенности преобразования примитивных числовых типов

Более широким считается тип, переменные которого могут

принимать большее количество значений
Вещественные типы считаются шире целочисленных
Это, естественно, не так

long orig = 0x7effffff00000000L;
float fval = orig;
long lose = (long)fval;

orig = 9151314438521880576
fval = 9.1513144e18
lose = 9151314442816847872

$500 млн за строчку кода или стоимость ошибок ПО в космосе
http://geektimes.ru/post/252690/

Слайд 31

Операторы ссылочных типов new – создание объекта класса = – присвоение

Операторы ссылочных типов

new – создание объекта класса
= – присвоение ссылки
Тип выражения

справа должен допускать присвоение в тип переменной слева
== и != – сравнение ссылок
Сравниваются только ссылки, а не состояние объектов!
. – разыменование ссылки
reference.method()
reference.field
() – вызов метода
У любого объекта можно вызвать методы, объявленные в классе Object
Слайд 32

Преобразование ссылочных типов Преобразование типа возможно, только если контракт целевого типа

Преобразование ссылочных типов

Преобразование типа возможно, только если контракт целевого типа является

частью контракта приводимого типа
Более широким считается тип, переменные которого могут принимать большее количество значений. Родительский тип считается более общим (широким), чем дочерний.
Неявное преобразование типов – преобразование от более узкого к более широкому
Явное преобразование типов – преобразование от более широкого к более узкому с помощью оператора явного преобразования (type)expr
Слайд 33

Преобразование и проверка ссылочных типов Если явное преобразование типов невозможно, возникает

Преобразование и проверка ссылочных типов

Если явное преобразование типов невозможно, возникает ошибка

java.lang.ClassCastException
Соответствие типа можно проверить с помощью оператора instanceof, возвращающего true, если тип применим к объекту и false, если нет
Оператор instanceof не позволяет определить реальный тип объекта, а лишь проверяет его соответствие указанному типу

Integer i = new Integer(5);
Object o = i;
i = (Integer) o;

Integer i = new Integer(5);
Object o = i;
if (o instanceof Integer) {
i = (Integer) o;
...
}
else { ... }

Слайд 34

Оператор ветвления Формат: ? : Если логическое выражение истинно, возвращается значение

Оператор ветвления

Формат: <логическое выражение> ? <значение 1> : <значение 2>
Если логическое выражение

истинно, возвращается значение второго операнда, а если ложно – третьего операнда
Типы второго и третьего операндов должны быть «совместимы»
Оператор можно применять в выражениях присваивания вместо инструкции ветвления

double factor = (a > b) ? 1 : 0.7;

boolean flag = ...;
...
factor = flag ? 1 : 0.7;
/*
if (flag)
factor = 1;
else
factor = 0.7;
*/

Слайд 35

Работа со строками Для работы со строками существуют специальные классы String

Работа со строками

Для работы со строками существуют специальные классы String и

StringBuffer (StringBuilder с Java5)
Каждый строковый литерал порождает экземпляр класса String
Значение любого типа может быть приведено к строке
Если хотя бы один из операндов оператора + является ссылкой на строку, то остальные операнды также приводятся к строке, а оператор трактуется как конкатенация строк
Слайд 36

Массивы Массив – упорядоченный набор элементов одного типа Элементами могут быть

Массивы

Массив – упорядоченный набор элементов одного типа
Элементами могут быть значения простых

и ссылочных типов
Массивы сами по себе являются объектами и наследуют от класса Object
Доступ к элементам по целочисленному индексу с помощью оператора []
Слайд 37

Объявление одномерных массивов Объявление, инициализация, заполнение Способ «3 в 1» int

Объявление одномерных массивов

Объявление, инициализация, заполнение
Способ «3 в 1»

int array1[], justIntVariable =

0;
int[] array2;
array2 = new int[20];
for (int i = 0; i < array2.length; i++)
array2[i] = 1000;

byte[] someBytes = {0, 2, 4, 8, 16, 32};
someMethod(new long[] {1, 2, 3, 4, 5});

Слайд 38

Работа с одномерными массивами Форма объявления ссылки на массив с квадратными

Работа с одномерными массивами

Форма объявления ссылки на массив с квадратными скобками

после типа элемента является более предпочтительной
Объект массива создается с помощью оператора new
Массив при этом заполняется значениями по умолчанию для типа его элементов (0, false или null)
Нумерация в массивах начинается с 0
Длина массива хранится в публичном неизменяемом поле length
Изменить длину массива после создания его объекта нельзя
Слайд 39

Многомерные массивы Состоят из одномерных массивов, элементами которых являются ссылки на

Многомерные массивы

Состоят из одномерных массивов, элементами которых являются ссылки на массивы

меньшей размерности
При создании объекта необязательно указывать все размерности
Массив необязательно должен быть «прямоугольным»

// Автоматическая
int[][] twoDimArr = new int[10][5];
// Вручную
int[][] twoDimArr = new int[10][];
for (int i = 0; i < 10; i++)
twoDimArr[i] = new int[i];
// Явно
int[][] arr3 = { {0}, {0, 1}, {0, 2, 4} };

Слайд 40

Инструкции Инструкция Описание одного действия «Заканчивается» знаком ; Тела методов, конструкторов

Инструкции

Инструкция
Описание одного действия
«Заканчивается» знаком ;
Тела методов, конструкторов и блоков инициализации состоят

из набора инструкций
Виды инструкций
Выражения присваивания
Префиксные и постфиксные формы выражений с операторами инкремента и декремента
Конструкции вызова методов
Выражения создания объектов
Составные инструкции
Управляющие порядком вычислений
Слайд 41

Блок Составная инструкция Может использоваться в любом месте, где допускается инструкция

Блок

Составная инструкция
Может использоваться в любом месте, где допускается инструкция
Определяет область видимости

локальных переменных: объявленная внутри блока переменная не видна за его пределами

int a = 5;
int b = 10;
{
int c = a + b;
int d = a – b;
}

Слайд 42

Ветвление Полная форма Неполная форма else относится к ближайшему выражению if,

Ветвление

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

if

(ЛогическоеВыражение)
Инструкция1
else
Инструкция2

if (ЛогическоеВыражение)
Инструкция1

Слайд 43

Блок переключателей Для типов char, byte, short, int, String (Java 7)

Блок переключателей

Для типов char, byte, short, int, String (Java 7)
Выполняются инструкции,

расположенные за меткой case, предложение которой совпало со значением параметра блока переключателей
Если ни одно из предложений не подошло, выполняются инструкции, расположенные за меткой default
Метка default является необязательной
Метка case или default не служит признаком завершения блока переключателей
Команда break передает управление первой инструкции, следующей за блоком переключателей

switch (ЦелочисленноеВыражение или String) {
case n: Инструкции
case m: Инструкции
...
default: Инструкции
}

Слайд 44

Строки в предложениях switch В качестве проверяемого значения можно указывать ссылку

Строки в предложениях switch

В качестве проверяемого значения можно указывать ссылку на

объект строки
В качестве значений для сравнения можно указывать
строковые литералы
ссылки на строки, объявление которых снабжено модификатором final
Сравнение значений производится также, как если бы использовался метод String.equals()
регистр имеет значение
начальные и концевые пробелы имеют значение
Слайд 45

Строки в предложениях switch public static Gender convert(String s) { Gender

Строки в предложениях switch

public static Gender convert(String s) {
Gender g;

switch (s) {
case "м": case "муж": case "муж.": case "мужской":
g = Gender.Male; break;
case "ж": case "жен": case "жен.": case "женский":
g = Gender.Female; break;
default:
g = Gender.Unknown; break;
}
return g;
}
Слайд 46

Условные циклы while Форма с предусловием Выполняется пока условие истинно Если

Условные циклы while

Форма с предусловием
Выполняется пока условие истинно
Если при входе в

цикл условие ложно, цикл не выполняется
Форма с постусловием
Выполняется пока условие истинно
При первом входе в цикл проверка условия не производится

while (ЛогическоеВыражение)
Инструкция

do
Инструкция
while (ЛогическоеВыражение);

Слайд 47

Цикл с предусловием for Формально цикл for в Java не является

Цикл с предусловием for

Формально цикл for в Java не является циклом

со счетчиком
Общий синтаксис
Все секции заголовка являются необязательными
Тело также может быть пустым

for(СекцияИнициализации; ЛогиескоеВыражение; СекцияИзменения)
Инструкция

for( ; ; );

Слайд 48

Секции цикла for Секции инициализации и изменения могут быть представлены списком

Секции цикла for

Секции инициализации и изменения могут быть представлены списком выражений,

разделенных запятой
Допустимо объявление переменных в секции инициализации

for (i = 0, j = 50; j >= 0; i++, j--) {
//...
}

for (int i = 0, j = 50; j >= 0; i++, j--) {
//...
}

Слайд 49

Объявление переменных в цикле for При инициализации переменных различных типов они

Объявление переменных в цикле for

При инициализации переменных различных типов они не должны

объявляться внутри заголовка

for (int i = 0, Cell node = head;
i < MAX && node != null;
i++, node = node.next) {
//...
}

int i; Cell node;
for (i = 0, node = head;
i < MAX && node != null;
i++, node = node.next) {
//...
}

Слайд 50

Работа с метками Метка метка: Инструкция Оператора goto в Java нет!!!

Работа с метками

Метка метка: Инструкция
Оператора goto в Java нет!!!
Метками можно помечать блоки

инструкций и циклы
Обращаться к меткам разрешено только с помощью команд break и continue
Слайд 51

break Применяется для завершения выполнения кода блока инструкций Завершение текущего блока

break

Применяется для завершения выполнения кода блока инструкций
Завершение текущего блока (безымянная форма) break;
Завершение

указанного блока (именованная форма) break метка;
Завершить блок, который сейчас не выполняется, нельзя!
Слайд 52

private float[][] matrix; public boolean workOnFlag(float flag) { int y, x;

private float[][] matrix;
public boolean workOnFlag(float flag) {
int y, x;
boolean

found = false;
search:
for (y = 0; y < matrix.length; y++) {
for (x = 0; x < matrix[y].length; x++) {
if (matrix[y][x] == flag) {
found = true;
break search;
}
}
}
//...
}

break

Слайд 53

continue Применяется только в контексте циклических конструкций Производит передачу управления в

continue

Применяется только в контексте циклических конструкций
Производит передачу управления в конец тела

цикла
Завершение витка текущего цикла (безымянная форма) continue;
Завершение витка указанного цикла (именованная форма) continue метка;
Завершить виток цикла, который сейчас не выполняется, нельзя!
Слайд 54

continue static void doubleUp(int[][] matrix) { int order = matrix.length; column:

continue

static void doubleUp(int[][] matrix) {
int order = matrix.length;
column:
for

(int i = 0; i < order; i++) {
for (int j = 0; j < order; j++) {
matrix[i][j] = matrix[j][i] =
matrix[i][j] * 2;
if (i == j)
continue column;
}
}
}
Слайд 55

Возврат из метода Инструкция return прекращает выполнение метода и возвращает его

Возврат из метода

Инструкция return прекращает выполнение метода и возвращает его результат
С

возвращаемым значением return value;
Значение должно быть приводимо к типу, возвращаемому методом
Без возвращаемого значения return;
методы void
конструкторы
Слайд 56

Спасибо за внимание!

Спасибо за внимание!