Java - строго типизированный язык

Содержание

Слайд 2

Строгая типизация

Java – строго типизированный язык

Каждая переменная обладает типом, каждое выражение имеет

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

Все присваивания, как явные, так и за счет передачи параметров в вызовах методов, проверяются на соответствие типов.

Слайд 3

Типы в Java

Типы в Java

Слайд 4

Переменные в Java

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

Переменные в Java Переменная может называться любой последовательностью латинских букв, цифр и
подчеркивания но, при этом, не могут начинаться с цифры.


int a2;
double xx = 0.15;
….

Слайд 5

Ключевое слово final

Константа— это фактически переменная, объявленная с ключевым словом (модификатором) final

Ключевое слово final Константа— это фактически переменная, объявленная с ключевым словом (модификатором)
(оно как раз и говорит о том, что значение переменной изменяться не будет).

Константа — это именованная ячейка памяти, способная хранить данные, которые потом изменяться не будут.


final double Pi = 3.1415926536;

Pi = 3.14; //Ошибка!

Слайд 6

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

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

Слайд 7

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

 

 

Прямой код

Положительный целые числа в прямом обратном

Представление положительных целых чисел в памяти Прямой код Положительный целые числа в
и дополнительном коде выглядят одинаково!

Слайд 8

Представление отрицательны целых чисел в памяти

 

Прямой код

Обратный (инверсный) код

Дополнительный код (двоичное дополнение)

 

Представление отрицательны целых чисел в памяти Прямой код Обратный (инверсный) код Дополнительный код (двоичное дополнение)

Слайд 9

Подводные камни

Подводные камни

Слайд 10

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

Литерал (англ. literal — константа) — запись в исходном коде компьютерной программы, представляющая собой фиксированное значение. Литералами

Целочисленные литералы Литерал (англ. literal — константа) — запись в исходном коде
также называют представление значения некоторого типа данных.

 

Слайд 11

Арифметические операции

Арифметические операции

Слайд 12

Арифметические операции

Арифметические операции

Слайд 13

Упражнение

Написать программу, которая вычисляет количество миль, проходимым лучом света за указанное число

Упражнение Написать программу, которая вычисляет количество миль, проходимым лучом света за указанное
дней.
(приблизительная скорость света в милях за секунду - 186000)
(в качестве типа для переменной результата использовать long)

final int v = 186000; //Приблизительная скорость света в милях за секунду
int d = in.nextInt(); //Ввод числа дней пользователем
long r; //Переменная для записи бедующего результата
long c = d*24*60*60; //Конвертируем количество дней в секунды
r = c*v; //Вычисляем количество миль(результат)
out.println(r); //Вывод результата

Слайд 14

Типы с плавающей точкой (действительные числа)

Типы с плавающей точкой (действительные числа)

Слайд 15

Типы с плавающей точкой (действительные числа)

Типы с плавающей точкой (действительные числа)

Слайд 16

Действительные литералы

 

Действительные литералы

Слайд 17

Упражнение

 

final double Pi =3.1416; //Число ПИ
float r = in.nextFloat(); //Ввод пользователем радиуса

Упражнение final double Pi =3.1416; //Число ПИ float r = in.nextFloat(); //Ввод
круга
double s; //Переменная для сохранения площади круга
s = Pi*r*r; //Вычисление площади круга (результата)
out.println(s); //Вывод результата

Слайд 18

Тип Char

Char являет собой десятичное представление шестнадцатеричного кода символа в таблице Unicode.

Char

Тип Char Char являет собой десятичное представление шестнадцатеричного кода символа в таблице
свободно конвертируется в числовые типы и обратно. (доступны все арифметические и побитовые операции)

Слайд 19

Подводные камни

Суррогатные пары

high surrogat

low surrogat

Если код символа превышает 65535

Сегодня кодировка Unicode

Подводные камни Суррогатные пары high surrogat low surrogat Если код символа превышает
насчитывает около 110 000 символов

Слайд 20

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

char a = ‘ё’;
char b = ‘\u0804’;
char b1 = 0x0804;
char

Символьные литералы char a = ‘ё’; char b = ‘\u0804’; char b1
c = ‘\141’;
char c2 = 141;
char e = ‘\t’; // табуляция – код 9
char f = ‘\n’; // перевод каретки на следующую строку – код 10
char g = ‘\r’; // возврат каретки – код 13
char h = ‘\’’; // одинарная кавычка
char i = ‘\\’; // обратный слеш
char j = ‘\”’; // двойная кавычка
char k = ‘\b’; // возврат на одну позицию («забой»)

Слайд 21

Тип Boolean

Операции сравнения:
<; >; ==; <=; >=; !=

Логические операции:

Тип Boolean Операции сравнения: ; ==; =; != Логические операции:

Слайд 22

Литералы Boolean

boolean a = true;
boolean b = false;

Литералы Boolean boolean a = true; boolean b = false;

Слайд 23

Троичный условный оператор (тернарный оператор) ?: или ?

переменная = выражение1 ? выражение2

Троичный условный оператор (тернарный оператор) ?: или ? переменная = выражение1 ?
: выражение 3

выражение1 – boolean
если выражение1 = true, то вычисляется выражение2
если выражение1 = false, то вычисляется выражение3
результат работы оператора равен значению вычисленного выражения
выражение2 и выражение3 должны возвращать значения одинакового или совместного типа, которым не может быть void.

Слайд 24

Пример использования троичного условного оператора (Упражнение)

Составить и отладить программу, которая, принимая от

Пример использования троичного условного оператора (Упражнение) Составить и отладить программу, которая, принимая
пользователя значения a,b и x определяет, лежит ли x внутри отрезка (a,b). В случае попадания x в отрезок вывести true, в противном случае – false.
(Для проверки условия использовать троичный условный оператор)

int a = in.nextInt(); // ввод a
int b = in.nextInt(); // ввод b
int x = in.nextInt(); // ввод c
boolean r; // переменная для записи результата
r = (x > a)&&(x < b)?true:false; // вычисление результата
out.println(r); // вывод результата

Слайд 25

Неявное (автоматическое) преобразование типов

При присвоении данных переменной одного типа переменной другого типа

Неявное (автоматическое) преобразование типов При присвоении данных переменной одного типа переменной другого
выполняется автоматическое преобразование типа в случае удовлетворения следующих условий:
оба типа совместимы
длинна текущего типа больше длинны исходного типа

byte > short > int > long


byte b = 10;
short s = b;

float > double

Слайд 26

Неявное (автоматическое) преобразование типов

Преобразование char в int или long


char a = ‘a’;
int

Неявное (автоматическое) преобразование типов Преобразование char в int или long … char
b = a;

Преобразование целочисленных типов в типы с плавающей точкой (возможна потеря точности)


int a = 12;
float b = a;

Слайд 27

Явное преобразование типов

Оператор приведения типа (typename)

При приведении более емкого целого типа к

Явное преобразование типов Оператор приведения типа (typename) При приведении более емкого целого
менее емкому старшие биты просто отбрасываются.
При приведении дробных чисел к целым, дробная часть отбрасывается (без округления).

… int i = (int) 3.94; //i=3

Слайд 28

Автоматическое повышение типов в выражениях

При вычислении выражения (a @ b), где @

Автоматическое повышение типов в выражениях При вычислении выражения (a @ b), где
- любая операция, a и b приводятся к одинаковому типу.

если хоть одно число double, то к double
если хоть одно число float, то к float
если хоть одно число long, то к long
в любом другом случае приводятся к int

… byte a = 3;
byte b = a*3; //Ошибка!

… byte a = 3;
byte b=3*3; // Норма!

Слайд 29

Неявное приведение типов с возможной потерей точности

Выражения (a @= выражение), где @

Неявное приведение типов с возможной потерей точности Выражения (a @= выражение), где
любая операция, раскрывается как
a = (typename) (a @ выражение)

Неявно срабатывает приведение типов даже с потерей точности!


int a = 300;
byte b = 3;
b += a //Норма!

… int a = 300;
byte b = 3;
b = b + a //Ошибка!

Слайд 30

Побитовые операторы

Могут применятся к целочисленным типам long, int, short, byte, char

Применяются ОТДЕЛЬНО

Побитовые операторы Могут применятся к целочисленным типам long, int, short, byte, char
К КАЖДОМУ БИТУ ЧИСЛА!

Слайд 31

Побитовый унарный оператор NOT (НЕ)

Инвертирует (меняет значения на противоположные) все биты операнда

Является

Побитовый унарный оператор NOT (НЕ) Инвертирует (меняет значения на противоположные) все биты
унарным (применяется к одной переменной)!


int a = 45;
int b;
b = ~a; //b= -46

Слайд 32

Побитовый унарный оператор NOT (НЕ)

Составить и отладить программу, которая, позволяет пользователю получить

Побитовый унарный оператор NOT (НЕ) Составить и отладить программу, которая, позволяет пользователю
противоположное значение введенного числа.
(Для решения задачи используйте оператор побитового отрицания)

int a = in.nextInt(); //Ввод числа пользователем
int r; //Переменная для записи результата
r = ~a+1; //Получение противоположного числа
out.println(r); //Вывод результата

Слайд 33

Побитовое AND (И)

Является бинарным (применяется к двум переменным)!

Побитовое AND (И) Является бинарным (применяется к двум переменным)!

Слайд 34

Побитовое AND (И)


int a = 45;
int b = 17;
int c;
c = a&b;

Побитовое AND (И) … int a = 45; int b = 17;
//c = 1

Слайд 35

Побитовое AND (И)

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

Побитовое AND (И) Составить и отладить программу, которая, позволяет установить, является ли
степенью двойки. Если да, то вывести true, в противном случае false.
(Для решения задачи используйте оператор побитовой конъюнкции)
(Для проверки условия использовать троичный условный оператор)

int a = in.nextInt(); //ввод числа пользователем
boolean r; //переменная результата
r = (a != 0)&&((a & a - 1)==0)?true:false; //получение результата
out.println(r); //вывод результата

На первый взгляд решение может показать странным, но выполнив все действия с битами вручную, Вы наверняка поймете как это работает!

Слайд 36

Побитовое OR (ИЛИ)

Является бинарным (применяется к двум переменным)!

Побитовое OR (ИЛИ) Является бинарным (применяется к двум переменным)!

Слайд 37

Побитовое OR (ИЛИ)


int a = 45;
int b = 17;
int c;
c = a|b;

Побитовое OR (ИЛИ) … int a = 45; int b = 17;
//c = 61

Слайд 38

Побитовое исключающее XOR

Является бинарным (применяется к двум переменным)!

Побитовое исключающее XOR Является бинарным (применяется к двум переменным)!

Слайд 39

Побитовое исключающее XOR


int a = 45;
int b = 17;
int c;
c = a^b;

Побитовое исключающее XOR … int a = 45; int b = 17;
//c=60

Слайд 40

Побитовое исключающее XOR

Составить и отладить программу, которая, позволяет обменять значения двух переменных.
(Для

Побитовое исключающее XOR Составить и отладить программу, которая, позволяет обменять значения двух
решения задачи используйте оператор XOR)
(Для решения задачи используйте только две переменные)

int a = in.nextInt();
int b = in.nextInt();
a=a ^ b;
b=a ^ b;
a=a ^ b;
out.println(a);
out.println(b);

Для лучшего понимания работы программы, выполните все операции вручную!

Слайд 41

Сдвиг в право SHR (арифметический сдвиг)

переменная1 = переменная2 >> на сколько бит

Сдвиг в право SHR (арифметический сдвиг) переменная1 = переменная2 >> на сколько
сдвинуть

сдвиг с учетом знака


int a = -46;
int b;
b=a>>2; //b = -12

Слайд 42

Сдвиг в право SHR (арифметический сдвиг)

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

Сдвиг в право SHR (арифметический сдвиг) Составить и отладить программу, которая будет
деление числа на 2.
(Использование операторов деления (/ и %) ЗАПРЕЩЕНО!)
(Для решения задачи используйте оператор побитового сдвига вправо с учетом знака)

int a = in.nextInt();
out.println(a >>= 1);

Для лучшего понимания работы программы, выполните все операции вручную!

Слайд 43

Сдвиг в право без учета знака SHR (логический сдвиг)

переменная1 = переменная2 >>>

Сдвиг в право без учета знака SHR (логический сдвиг) переменная1 = переменная2
на сколько бит сдвинуть

cдвиг без учета знака (левые позиции заполняются нулями)


int a = -46;
int b;
b = a>>>2; //b=1073741812

Слайд 44

Сдвиг в лево SHL

переменная1 = переменная2 << на сколько бит сдвинуть

Правые позиции

Сдвиг в лево SHL переменная1 = переменная2 Правые позиции заполняются нулями …
заполняются нулями


int a = -46;
int b;
b = a<<2; //b=-184

Слайд 45

Сдвиг в лево SHL

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

Сдвиг в лево SHL Составить и отладить программу, которая будет выполнять умножение
на 2.
(Использование оператора умножения (*) ЗАПРЕЩЕНО!)
(Для решения задачи используйте оператор побитового сдвига влево)

int a = in.nextInt();
out.println(a <<= 1);

Для лучшего понимания работы программы, выполните все операции вручную!

Слайд 46

Приоритет операторов

Приоритет операторов