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

Содержание

Слайд 2

План лекции Структура исходного кода и его элементы Типы данных Описание

План лекции

Структура исходного кода и его элементы
Типы данных
Описание классов
Общая структура
Поля
Методы
Конструкторы
Блоки инициализации
Точка

входа программы
Слайд 3

Кодировка Java спроектирована быть многоязыковой Java ориентирована на Unicode Первые 128

Кодировка

Java спроектирована быть многоязыковой
Java ориентирована на Unicode
Первые 128 символов почти идентичны

набору ASCII
Символы Unicode задаются двухбайтными последовательностями:
\u0000, \uFFff, \u0410, \u044F
Java чувствителен к регистру!
Слайд 4

Исходный код Исходный код разделяется на: Пробелы – разделяют текст на

Исходный код

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

\u0020, дес. код 32, пробел классический
ASCII-символ HT, \u0009, дес. код 9, горизонтальный таб
ASCII-символ FF, \u000c, дес. код 12, перевод страницы
ASCII-символ LF, \u000a , дес. код 10, символ новой строки
ASCII-символ CR, \u000d, дес. код 13, возврат каретки
Комментарии
Лексемы
Слайд 5

Исходный код double a = 1, b = 1, c =

Исходный код

double a = 1, b = 1, c = 6;
double

D = b * b - 4 * a * c;
if (D >= 0) {
double x1 = (-b + Math.sqrt (D)) / (2 * a);
double x2 = (-b - Math.sqrt (D)) / (2 * a);
}

double a=1,b=1,c=6;double D=b*b-4*a*c;if(D>=0)
{double x1=(-b+Math.sqrt(D))/(2*a);double
x2=(-b-Math.sqrt(D))/(2*a);}

Слайд 6

Лексемы Идентификаторы Служебные (ключевые) слова class, public, const, goto Литералы Разделители

Лексемы

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

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

Идентификаторы Имена, задаваемые элементам языка для упрощения доступа к ним Можно

Идентификаторы

Имена, задаваемые элементам языка для упрощения доступа к ним
Можно записывать символами

Unicode
Состоят из букв и цифр, знаков _ и $
Не допускают совпадения со служебными словами, литералами true, false, null
Длина имени не ограничена
Слайд 8

Служебные (ключевые) слова abstract double int strictfp boolean else interface super

Служебные (ключевые) слова

abstract double int strictfp
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
сatch float package throw
char for private throws
class goto protected transient
const if public try
continue implements return void
default import short volatile
do instanceof static while

Слайд 9

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

Типы данных

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

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

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

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

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

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

Примитивные типы Булевский (логический) тип 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)
Слайд 12

Литералы Булевы 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
Строковые "Это строковый литерал" ""
Слайд 13

Целочисленные литералы десятичный вид цифры 0-9 восьмеричный префикс 0, цифры 0-7

Целочисленные литералы

десятичный вид
цифры 0-9
восьмеричный
префикс 0, цифры 0-7
шестнадцатеричный вид
префикс 0x

или 0X, цифры 0-9, буквы A-F

1000000L 123l -200
0777777L 00L -0100L
0X7fffFL 0xC0B0L 0xCafe

Слайд 14

Дробные литералы целая часть; десятичная точка (ASCII -символ точка); дробная часть;

Дробные литералы

целая часть;
десятичная точка (ASCII -символ точка);
дробная часть;
порядок (ASCII -буква E в произвольном регистре и

целое число с опциональным + или - )
окончание-указатель типа

7.2 5.25D 4.
8. 3.14F .2
.9 .7f 3e3
7e-10 5d 5f

Слайд 15

Символьные литералы один символ из набора Unicode в одиночных кавычках (апострофах)

Символьные литералы

один символ из набора Unicode в одиночных кавычках (апострофах)
допускается специальная запись

для описания символа через его код
Есть поддержка ввода символа через восьмеричный код (совместимости с С)

'a' '\u0041' '\n'
' ' '\u0410' '\r'
'M' '\u0391' '\\'

Слайд 16

Символьные литералы \b \u0008 backspace BS – забой \t \u0009 horizontal

Символьные литералы

\b \u0008 backspace BS – забой
\t \u0009 horizontal tab HT

– табуляция
\n \u000a linefeed LF – конец строки
\f \u000c form feed FF – конец страницы
\r \u000d carriage return CR – возврат каретки
\" \u0022 double quote " – двойная кавычка
\' \u0027 single quote ' – одинарная кавычка
\\ \u005c backslash \ – обратная косая черта
\16-тиричный код символа, от \u0000 до \u00ff

Для записи специальных символов используются обозначения

Слайд 17

Строковые литералы состоят из набора символов и записываются в двойных кавычках

Строковые литералы

состоят из набора символов и записываются в двойных кавычках
длина литерала

может быть нулевой или сколь угодно большой
каждый строковый литерал является экземпляром класса String
для создания литерала из нескольких строк используются символы \n и/или \r, либо оператор конкатенации строк +
Слайд 18

Строковые литералы Примеры строковых литералов "" // литерал нулевой длины "\""

Строковые литералы

Примеры строковых литералов

"" // литерал нулевой длины
"\"" //литерал, состоящий

из одного символа "
"а это?" //простой строковый литерал
"Hello, world!\r\nHello!" //литерал из 2-х строк
"Длинный текст " +
"с переносом" //выражение из 2-х литералов
Слайд 19

Описание класса Класс может содержать: поля, методы, вложенные классы и интерфейсы.

Описание класса

Класс может содержать:
поля,
методы,
вложенные классы и интерфейсы.

class Body {
public long

idNum;
public String name;
public Body orbits;
public static long nextID = 0;
}
Слайд 20

Модификаторы объявления класса public Признак общедоступности класса abstract Признак абстрактности класса

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

public Признак общедоступности класса
abstract Признак абстрактности класса
final Завершенность класса (класс не допускает

наследования)
strictfp Повышенные требования к операциям с плавающей точкой
Слайд 21

Поля класса Объявление поля: [модификаторы] { [= ]}; double sum =

Поля класса

Объявление поля:
[модификаторы] <тип> {<имя> [= <инициализирующее выражение>]};
double sum = 2.5

+ 3.7;
public double val = sum + 2 * Math.sqrt(2);
Если поле класса явно не инициализируются, ему присваивается значение по умолчанию его типа (0, false или null)
Слайд 22

Поля класса Модификаторы полей: модификаторы доступа static поле статично (принадлежит контексту

Поля класса

Модификаторы полей:
модификаторы доступа
static поле статично (принадлежит контексту класса)
final поле не

может изменять свое значение после инициализации
transient поле не сериализуется (влияет только на механизмы сериализации)
volatile усиливает требования к работе с полем в многопоточных программах
Слайд 23

Методы Объявление метода: [модификаторы] [throws исключения] { } class Primes {

Методы

Объявление метода:
[модификаторы] <тип> <сигнатура> [throws исключения] {<тело>}

class Primes {
static int

nextPrime(int current) {
<Вычисление простого числа в теле метода>
}
}
Слайд 24

Модификаторы методов Модификаторы доступа abstract абстрактность метода (тело при этом не

Модификаторы методов

Модификаторы доступа
abstract абстрактность метода (тело при этом не описывается)
static статичность метода (метод

принадлежит контексту класса)
final завершенность метода (метод не может быть переопределен при наследовании)
Слайд 25

Модификаторы методов synchronized синхронизированность метода (особенности вызова метода в многопоточных приложениях)

Модификаторы методов

synchronized синхронизированность метода (особенности вызова метода в многопоточных приложениях)
native «нативность» метода (тело

метода не описывается, при вызове вызывается метод из native-библиотеки)
strictfp повышенные требования к операциям с плавающей точкой
Слайд 26

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

Особенности методов

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

контексте объекта reference.method(); methodReturningReference().method();
Для статических методов вызов через имя типа, через ссылку на объект или в контексте класса ClassName.staticMethod(); reference.staticMethod(); staticMethodReturningReference().method();
Наличие круглых скобок при вызове обязательно, т.к. они являются оператором вызова метода
Слайд 27

Особенности методов На время выполнения метода управление передается в тело метода

Особенности методов

На время выполнения метода управление передается в тело метода
Возвращается одно

значение простого или объектного типа return someValue;
Аргументы передаются по значению, т.е. значения параметров копируются в стек:
для примитивных типов копируются сами значения
для ссылочных типов копируется значение ссылки
Перегруженными являются методы с одинаковыми именами и различными сигнатурами
Слайд 28

Создание ссылки и создание объекта – различные операции Используется оператор new,

Создание ссылки и создание объекта – различные операции
Используется оператор new, он

возвращает ссылку на объект
После оператора указывается имя конструктора и его параметры

Создание объектов

Body sun;
sun = new Body();
sun.idNum = Body.nextID++;
sun.name = "Sun";
sun.orbits = null;
Body earth = new Body();
earth.idNum = Body.nextID++;
earth.name = "Earth";
earth.orbits = sun;

Слайд 29

Конструкторы Память для объекта выделяет оператор new Конструкторы предназначены для формирования

Конструкторы

Память для объекта выделяет оператор new
Конструкторы предназначены для формирования начального состояния

объекта
Правила написания конструктора сходны с правилами написания методов
Имя конструктора совпадает с именем класса
Слайд 30

Конструкторы Для конструкторов разрешено использование только модификаторов доступа При написании конструктор

Конструкторы

Для конструкторов разрешено использование только модификаторов доступа
При написании конструктор не имеет

возвращаемого типа
Оператор возврата return прекращает выполнение текущего конструктора
Конструкторы могут быть перегружены
Конструкторы могут вызывать друг друга с помощью ключевого слова this() в первой строке конструктора
Слайд 31

Конструкторы Если в классе явно не описан ни один конструктор, автоматически

Конструкторы

Если в классе явно не описан ни один конструктор, автоматически создается

т.н. конструктор по умолчанию, не имеющий параметров
Если в классе описан хотя бы один конструктор, то автоматически конструктор по умолчанию не создается
Также конструктором по умолчанию называют конструктор, не имеющий параметров
Слайд 32

class Body { public long idNum; public String name = "No

class Body {
public long idNum;
public String name = "No

Name";
public Body orbits = null;
private static long nextID = 0;
Body() {
idNum = nextID++;
}
Body(String name, Body orbits) {
this();
this.name = name;
this.orbits = orbits;
}
}

Конструкторы

Слайд 33

Деструкторы? В ряде языков деструкторы выполняют действия, обратные действию конструкторов: освобождают

Деструкторы?

В ряде языков деструкторы выполняют действия, обратные действию конструкторов: освобождают память,

занимаемую объектом, и «деинициализируют» объект (освобождают ресурсы, очищают связи, изменяют состояние связанных объектов)
Если после вызова деструктора где-то осталась ссылка (указатель) на объект, ее использование приведет к возникновению ошибки
В Java деструкторов нет, вместо них применяется механизм автоматической сборки мусора
Слайд 34

Автоматическая сборка мусора В случае нехватки памяти для создания очередного объекта

Автоматическая сборка мусора

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

машина находит недостижимые объекты и удаляет их
Процесс сборки мусора можно инициировать принудительно
Для явного удаления объекта следует утратить все ссылки на этот объект и инициировать сбор мусора
Взаимодействие со сборщиком осуществляется через системные классы java.lang.System и java.lang.Runtime
Слайд 35

Модификаторы доступа private Доступ только в контексте класса (package, default, none)

Модификаторы доступа

private
Доступ только в контексте класса
(package, default, none)
Доступ для самого класса

и классов в том же пакете
protected
Доступ в пределах самого класса, классов-наследников
и классов пакета
public
Доступ есть всегда, когда доступен сам класс
Слайд 36

Блоки инициализации Если некоторые действия по инициализации должны выполняться в любом

Блоки инициализации

Если некоторые действия по инициализации должны выполняться в любом варианте

создания объекта, удобнее использовать блоки инициализации
Тело блока инициализации заключается в фигурные скобки и располагается на одном уровне с полями и методами
При создании объекта сначала выполняются инициализирующие выражения полей и блоки инициализации (в порядке их описания в теле класса), а потом тело конструктора
Слайд 37

Блоки инициализации class Body { public long idNum; public String name

Блоки инициализации

class Body {
public long idNum;
public String name =

"No Name";
public Body orbits = null;
private static long nextID = 0;
{
idNum = nextID++;
}
Body(String name, Body orbits) {
this.name = name;
this.orbits = orbits;
}
}
Слайд 38

Статическая инициализация Статический блок инициализации выполняет инициализацию контекста класса Вызов статического

Статическая инициализация

Статический блок инициализации выполняет инициализацию контекста класса
Вызов статического блока инициализации

происходит в процессе загрузки класса в виртуальную машину

class Primes {
static int[] knownPrimes = new int[4];
static {
knownPrimes[0] = 2;
for (int i=1; i knownPrimes[i] = nextPrime(i);
}
//nextPrime() declaration etc.
}

Слайд 39

Понятие о пакетах Способ логической группировки классов Комплект ПО, который можно

Понятие о пакетах

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

и применять вместе с другими пакетами
Членами пакетов являются:
классы,
интерфейсы,
вложенные пакеты,
дополнительные файлы ресурсов
Слайд 40

Функциональность пакетов Позволяют группировать взаимосвязанные классы и интерфейсы в единое целое

Функциональность пакетов

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

пространств имен, позволяющих избежать конфликтов идентификаторов, относящихся к разным типам
Обеспечивают дополнительные средства защиты элементов кода
Образуют иерархическую систему
Слайд 41

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

Способы реализации и доступ к пакетам

Пакеты могут быть реализованы:
в виде структуры

каталогов с файлами классов,
в виде jar-архива.
Путь к используемым пакетам указывается:
непосредственно при запуске JVM,
через переменную окружения CLASSPATH (по умолчанию CLASSPATH="").
Слайд 42

Понятие имени Имена задаются посредством идентификаторов, указывают на компоненты программы Пространства

Понятие имени

Имена задаются посредством идентификаторов, указывают на компоненты программы
Пространства имен
пакеты
типы
поля
методы
локальные переменные

и параметры
метки
Имена бывают составные (java.lang.Double) и простые (Double)
Слайд 43

Душераздирающий, но корректный код Пример зависимости имени от контекста package Reuse;

Душераздирающий, но корректный код

Пример зависимости имени от контекста

package Reuse;
class Reuse {

Reuse Reuse (Reuse Reuse) {
Reuse:
for(;;) {
if (Reuse.Reuse(Reuse) == Reuse)
break Reuse;
}
return Reuse;
}
}
Слайд 44

Понятие модуля компиляции Модуль компиляции хранится в .java файле и является

Понятие модуля компиляции

Модуль компиляции хранится в .java файле и является единичной

порцией входных данных для компилятора.
Состоит из:
объявления пакета package mypackage;
выражений импортирования import java.net.Socket; import java.io.*;
объявлений верхнего уровня – классов и интерфейсов
Слайд 45

Объявление пакета Первое выражение в модуле компиляции (например, для файла java/lang/Object.java)

Объявление пакета

Первое выражение в модуле компиляции (например, для файла java/lang/Object.java)
package java.lang;
При

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

Объявление пакета Если файл модуля компиляции доступен JVM, то пакеты также

Объявление пакета

Если файл модуля компиляции доступен JVM, то пакеты также доступны
Если

пакет доступен, то область его видимости – все модули компиляции
ограничений на доступ к пакетам нет
пакеты java.lang и java.io доступны всегда

package space.stars;
class Sun {
...
}

Слайд 47

Выражения импорта Доступ к типу из данного пакета – по простому

Выражения импорта

Доступ к типу из данного пакета – по простому имени

типа
Доступ к типу из других пакетов – по составному имени пакета и имени типа
сложности при многократном использовании
import-выражения упрощают доступ
импорт одного типа (import java.net.URL;)
импорт пакета с типами (import java.net.*;)
Слайд 48

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

Выражения импорта

Попытка импорта пакета, недоступного на момент компиляции, вызовет ошибку
Дублирование импорта

игнорируется
Нельзя импортировать вложенный пакет
import java.net; //ошибка компиляции
При импорте типов пакета вложенные пакеты не импортируются!
Слайд 49

Выражения импорта Алгоритм компилятора при анализе типов: выражения, импортирующие типы другие

Выражения импорта

Алгоритм компилятора при анализе типов:
выражения, импортирующие типы
другие объявленные типы
выражения, импортирующие

пакеты
Если тип импортирован явно невозможны:
объявление нового типа с таким же именем
доступ по простому имени к одноименному типу в текущем пакете
Слайд 50

Выражения импорта Импорт пакета не мешает объявлять новые типы или обращаться

Выражения импорта

Импорт пакета не мешает объявлять новые типы или обращаться к

имеющимся типам текущего пакета по простым именам
поиск типа сначала в текущем пакете
Импорт конкретных типов дает возможность при прочтении кода сразу понять, какие внешние типы используются
но эти типы могут и не использоваться
Слайд 51

Объявление верхнего уровня Область видимости типа – пакет Доступ к типу

Объявление верхнего уровня

Область видимости типа – пакет
Доступ к типу извне его

пакета
по составному имени
через выражения импорта
Разграничение (модификаторы) доступа

package first;
class MyFirstClass {
}
interface MyFirstInterface {
}

Слайд 52

Объявление верхнего уровня В модуле компиляции может быть максимум один public

Объявление верхнего уровня

В модуле компиляции может быть максимум один public тип
Имя типа и

имя файла должны совпадать
Другие не-public типы модуля должны использоваться только внутри этого модуля
Как правило, один модуль компиляции содержит один тип
Слайд 53

Правила именования Пакеты java.lang javax.swing ru.ssau.infokom com.sun.xml.internal.ws.protocol.xml Типы Student Cloneable Serializable ArrayIndexOutOfBoundException Поля value enabled distanceFromShop

Правила именования

Пакеты
java.lang
javax.swing
ru.ssau.infokom
com.sun.xml.internal.ws.protocol.xml
Типы
Student
Cloneable
Serializable
ArrayIndexOutOfBoundException
Поля
value
enabled
distanceFromShop

Слайд 54

Правила именования Методы getValue(), setValue(…) isEnabled(…) length() toString() Поля-константы PI SIZE_MIN,

Правила именования

Методы
getValue(), setValue(…)
isEnabled(…)
length()
toString()
Поля-константы
PI
SIZE_MIN, SIZE_MAX, SIZE_DEF
Локальные переменные
byte b; char c; int i,j,k;

long l; double d;
Object o; String s;
Exception e
Слайд 55

Точка входа программы Метод Статический Доступный С параметрами-аргументами Без возвращаемого значения

Точка входа программы

Метод
Статический
Доступный

С параметрами-аргументами
Без возвращаемого значения

class Echo {
public static void

main(String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i] + " ");
System.out.println();
}
}
Слайд 56

Комментарии Не влияют на итоговый бинарный код Используются для ввода пояснений

Комментарии

Не влияют на итоговый бинарный код
Используются для ввода пояснений
Бывают двух видов
Строчные,

одна строка
Блочные, несколько строк
Слайд 57

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

Комментарии

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

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

Комментарии int bonus = 100500; // эм, комментарии? /* Особенный цикл,

Комментарии

int bonus = 100500; // эм, комментарии?

/*
Особенный цикл, начинаться

с единицы
из-за особенностей алгоритма
*/
for (int i=1; i<10; i++) {
...
}

float s = 2*Math.PI/*getRadius()*/;
// Закомментировано для отладки

Слайд 59

Комментарии // Текст /*…*/ будет частью строки s String s =

Комментарии

// Текст /*…*/ будет частью строки s
String s = "text/*just

text*/";

// Ошибка, комментарий разбил имя метода
circle.get/*comment*/Radius();

// Комментарий может разделять вызовы функций: circle./*comment*/getRadius();

// Комментарий может заменять пробелы: int/*comment*/x=1;

Слайд 60

Комментарии // еще один честный комментарий ниже /* начало комментария /*

Комментарии

// еще один честный комментарий ниже
/* начало комментария /* //

/** завершение: */

// Ошибка компилятора на 7 строке
1. /*
2. comment
3. /*
4. more comments
5. */
6. finish:
7. */

Слайд 61

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

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

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

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

Комментарии документирования (javadoc) /** * Вычисление модуля целого числа. * Этот

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

/**
* Вычисление модуля целого числа.
* Этот метод

возвращает
* абсолютное значение аргумента x.
*/
int getAbs(int x) {
if (x>=0)
return x;
else
return -x;
}
Слайд 63

Комментарии документирования (javadoc) /** * Первое предложение - краткое описание метода.

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

/**
* Первое предложение - краткое описание метода.
*


*


* if (condition==true) {
* x = getWidth();
* }
*

* А так описывается HTML-список:
*
  • Вот наклонный шрифт курсив,
    *
  • Вот шрифт стиля bold

*/
public void calculate (int x, int y) {
...
}
Слайд 64

Комментарии документирования (javadoc) Первое предложение – краткое описание метода. if (condition==true)

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

Первое предложение – краткое описание метода.
if (condition==true) {
x

= getWidth();
}
А так описывается HTML-список:
* Вот наклонный шрифт курсив,
* Вот шрифт стиля bold
Слайд 65

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

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