
- •Занятие 1-2 Базовые типы Java, литералы, переменные и константы, приведение типов, основные операторы
- •Литералы
- •Переменные
- •Операции
- •Операция присваивания
- •Приведение типов
- •Арифметические операции
- •Приоритет операций
- •Занятие 4
- •Занятие 3 Циклы в Java
- •Цикл типа «пока» (операторы while и do…while)
- •Цикл типа «n-раз» (оператор for)
- •Досрочное завершение цикла (оператор break)
- •Занятие 3-5
Приведение типов
При всём многообразии типов часто возникают ситуации, когда данные одного типа нужно преобразовать к другому типу.
Некоторые преобразования происходят неявно. Рассмотрим такой пример:
double a = 3;
System.out.println(a); // выведет 3.0
Переменная типа double предусматривает хранение не только целой, но и десятичной части числа, т.е. фактически в переменную запишется значение 3.0 (три целых и ноль десятых), которое потом и выведется на экран с помощью следующей команды.
Java преобразовала 3 в 3.0 (целые в вещественные) самостоятельно, без явного участия разработчика. Такое преобразование (или, как ещё говорят, приведение) типа данных называется неявным или автоматическим.
Оно происходит всякий раз, когда в процессе преобразования не могут потеряться какие-либо данные (т.е. когда преобразования производится к более универсальному типу: от коротких целых short к длинным целым long, от целых int к вещественным double и т.п.).
Но потеря может происходить, когда мы попытаемся, например, из вещественного числа получить целое. Это можно сделать округлив число или взяв только его целую часть. Но дробную часть при этом придётся забыть, и, если она не была нулевой, то какие-то полезные данные могут потеряться.
Например, если мы произведём следующее присваивание, то при попытке откомпилировать программу получим такую ошибку от отладчика «возможна потеря точности»:
int a = 3.14; // ошибка possible loss of precision
Но даже если десятичная часть была бы нулевой (справа стояло бы значение 3.0), то мы получили бы ту же ошибку. То есть Java не занимается анализом самого значения, а обращает внимание только на его тип.
Тем не менее, преобразовать вещественное значение к целому мы всё таким можем, явно сообщив в программе о своём намерении. Для этого слева от исходного элемента надо в круглых скобках указать название типа, к которому его нужно привести.
int a = (int) 3.14;
System.out.println(a); // выведет 3
Такое преобразование с указанием целевого типа называется явным.
Явное преобразование вещественного значения к целому типу происходит за счёт отбрасывания десятичной части (берётся только целая часть).
double b = 2.6;
int c = (int) (0.5 + b); // можно применять к целым выражениям
System.out.println(c); // выведет 3
System.out.println((int)9.69); // выведет 9
System.out.println((int)'A'); // выведет 65 — код символа «A»
System.out.println((double)3); // выведет 3.0
Явное преобразование может потребоваться также в тех случаях, когда значение типа позволяющего хранить большее количество знаков надо привести к типу, способному хранить меньшее количество знаков числа. Например, когда long надо преобразовать к short. О том, как происходят такие преобразования, будет рассказано далее при обсуждении принципов хранения данных в памяти компьютера.
Арифметические операции
Это бинарные операции, т.е. в них участвует два операнда. Оба операнда должны быть числового типа.
+ — складывает оба операнда и возвращает результат сложения.
- — вычитает из первого операнда второй.
* — перемножает операнды и возвращает результат.
/ — делит первый операнд на второй без остатка (выполняет деление нацело), если оба операнда целые, и выполняет деление с остатком, в случае, если хотя бы один из операндов вещественный.
% — возвращает остаток от деления первого операнда на второй (иначе говоря, приводит первый аргумент по модулю второго). Напомним, что наименьший остаток при делении на любое натуральное n равняется нулю, а наибольший равняется n-1.
Если в какой-то арифметической операции задействованы аргументы разных типов, то перед выполнением операции все аргументы автоматически приводятся к более универсальному из задействованных типов.
System.out.println(2+3); // выведет 5
System.out.println(10%3); // выведет 1
System.out.println(12%3); // выведет 0
System.out.println(9/2); // выведет 4
System.out.println(9/2.0); // выведет 4.5
System.out.println(9d/2); // выведет 4.5
System.out.println((double)7/2); // выведет 3.5
System.out.println((double)(7/2)); // выведет 3.0, ведь к целым преобразуется уже результат деления нацело