Опубликован: 04.12.2009 | Уровень: специалист | Доступ: платный
Лекция 3:

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

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Аннотация: Булевский (логический) тип. Целые типы, переменные, константы. Основные операторы для работы с целочисленными величинами. Вещественные типы и класс Math. Правила явного и автоматического преобразования типа при работе с числовыми величинами. Оболочечные классы. Упаковка (boxing) и распаковка (unboxing). Приоритет операторов.
Ключевые слова: логический оператор, операции отношения, значение, выражение, таблица истинности, процессор, Java, логические выражения, оценивание, булевское выражение, целочисленный тип, время компиляции, символьные типы, управляющая последовательность, код символа, таблица, ASCII, присваивание, константы, именованная константа, место, операторы, автоматическое преобразование, инкремент, декремент, экранная форма, wrapper, мантисса, math, имя функции, имя пакета, методы класса, переменная класса, ACO, экспонента, натуральный логарифмы, ceiling, floor, ULP, псевдослучайное число, класс, компьютер, подстановка, операнд, совместимость типов, диапазон, компилятор, сообщение об ошибке, loss, precision, потеря точности, явное преобразование, переменная, преобразование типов, примитивный тип, объект, объектный тип, исключение, box, обратное преобразование, unboxing, поле, операции, JDK, программирование, связь, сборка мусора, быстродействие, байт, автор, умножение, деление, сложение, вычитание, понимание текста, логические ошибки, таблица приоритетов, последовательность операторов, логическое ИЛИ

3.1. Булевский (логический) тип

Величины типа boolean принимают значения true или false.

Объявление булевских переменных:

boolean a;
boolean b;

Использование в выражениях при присваиваниях:

a=true;
b=a;

Булевские величины обычно используются в логических операторах и в операциях отношения.

Таблица 3.1. Логические операторы
Оператор Название Пример
&& логическое "И" ( and ) a&&b
|| логическое "ИЛИ" ( or ) a||b
^ логическое "исключающее ИЛИ" ( xor ) a^b
! логическое "НЕ" ( not ) !a

Значением логического выражения являются true или false. Например, если a=true, b=true, то a && b имеет значение true. А при a=false или b=false выражение a && b принимает значение false.

Для работы с логическими выражениями часто применяют так называемые таблицы истинности. В них вместо логической единицы ( true ) пишут 1, а вместо логического нуля ( false ) пишут 0. В приведенной ниже таблице указаны значения логических выражений при всех возможных комбинациях значений a и b.

Таблица 3.2.
a 0 0 1 1
b 0 1 0 1
Выражение Значения
a&&b 0 0 0 1
a||b 0 1 1 1
a^b 0 1 1 0
!a 1 1 0 0

Выполнение булевских операторов происходит на аппаратном уровне, а значит, очень быстро. Реально процессор оперирует числами 0 и 1, хотя в Java это осуществляется скрытым от программиста образом.

Логические выражения в Java вычисляются в соответствии с так называемым укороченным оцениванием: из приведенной выше таблицы видно, что если a имеет значение false, то значение оператора a&&b будет равно false независимо от значения b. Поэтому если b является булевским выражением, его можно не вычислять. Аналогично, если a имеет значение true, то значение оператора a||b будет равно true независимо от значения b.

Операции отношения

Это операторы сравнения и принадлежности. Они имеют результат типа boolean. Операторы сравнения применимы к любым величинам a и b одного типа, а также к произвольным числовым величинам a и b, не обязательно имеющим один тип.

Таблица 3.3.
Оператор Название Пример
== равно a==b
!= не равно a!=b
> больше a>b
< меньше a<b
>= больше или равно a>=b
<= меньше или равно a<=b
instanceof Принадлежность объекта классу obj instanceof MyClass

Про оператор instanceof будет рассказано в разделе, посвященном динамической проверке типов.

3.2. Целые типы, переменные, константы

Таблица 3.4.
Тип Число байт Диапазон значений Описание
byte 1 -128..127 Однобайтовое целое число (8-битное целое со знаком)
short 2 -2^{15}..2^{15}-1 = - 32768.. 32767 Короткое целое число (16- битное целое со знаком)
char 2 \setminus u0000 \ldots\setminus uFFFF=0 \ldots 65535 Символьный тип (беззнаковое 16- битное целое)
int 4 -2^{31}..2^{31}-1 = - 2.147483648*10^9.. 2.147483647*10^9 Целое число (32- битное целое со знаком)
long 8 -2^{63}..2^{63}-1 = -9.22337203685478·10^{18}.. 9.22337203685478·10^{18} Длинное целое число (64- битное целое со знаком)

Для задания в тексте программы численных литерных констант типа long, выходящих за пределы диапазона чисел типа int, после написания числа следует ставить постфикс – букву L. Например, 600000000000000L. Можно ставить и строчную l, но ее хуже видно, особенно – на распечатках программы (можно перепутать с единицей). В остальных случаях для всех целочисленных типов значение указывается в обычном виде, и оно считается имеющим тип int – но при присваивании число типа int автоматически преобразуется в значение типа long.

Как уже говорилось, объявление переменных может осуществляться либо в классе, либо в методе.

В классе их можно объявлять как без явного присваивания начального значения, так и с указанием этого значения. Если начальное значение не указано, величина инициализируется нулевым значением. Если объявляется несколько переменных одного типа, после указания имени типа разрешается перечислять несколько переменных, в том числе – с присваиванием им начальных значений.

В методе все переменные перед использованием обязательно надо инициализировать – автоматической инициализации для них не происходит. Это надо делать либо при объявлении, либо до попытки использования значения переменной в подпрограмме. Попытка использования в подпрограмме значения неинициализированной переменной приводит к ошибке во время компиляции.

Рассмотрим примеры задания переменных в классе.

int i,j,k;
int j1;
byte i1,i2=-5;
short i3=-15600;
long m1=1,m2,m3=-100;

Заметим, что после указанных объявлений переменные i,j,k,j1,i1,m2 имеют значение 0. Для i1 это неочевидно – можно подумать, что обе переменные инициализируются значением -5. Поэтому лучше писать так:

byte i1=0,i2=-5;

Использование в выражениях:

i=5;
j=i*i + 1
m1=j
m2=255;
m1=m1 + m2*2;

Тип char в Java, как и в C/C++, является числовым, хотя и предназначен для хранения отдельных символов. Переменной символьного типа можно присваивать один символ, заключенный в одинарные кавычки, либо кодирующую символ управляющую последовательность Unicode. Либо можно присваивать числовой код символа Unicode (номер символа в кодовой таблице):

  • char c1='a';
  • char c2='\u0061';
  • char c3=97;

Все три приведенные декларации переменных присваивают переменным десятичное значение 97, соответствующее латинской букве "a".

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

'A' имеет код 65, 'B' - 66, 'Z' - 90, 'a' - 97, 'z' - 122, '0' - 48, '1' - 49, '9' - 57, ':' - 58, ';' - 59, '<' - 60, '=' - 61, '>' - 62, и так далее.

К сожалению, с переменными и значениями символьного типа можно совершать все действия, которые разрешено совершать с целыми числами. Поэтому символьные значения можно складывать и вычитать, умножать и делить не только на "обычные" целые величины, но и друг на друга! То есть присваивание с1='a'*'a'+1000/'b' вполне допустимо, несмотря на явную логическую абсурдность.

Константами называются именованные ячейки памяти с неизменяемым содержимым. Объявление констант осуществляется в классе, при этом перед именем типа константы ставится комбинация зарезервированных слов public и final:

public final int MAX1=255;
public final int MILLENIUM=1000;

Константами можно пользоваться как переменными, доступными только по чтению. Попытка присвоить константе значение с помощью оператора присваивания "=" вызывает ошибку компиляции.

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

Имеется следующее правило хорошего тона: никогда не используйте одно и то же числовое литерное значение в разных местах программы, вместо этого следует задать константу и использовать ее имя в этих местах. Например, мы пишем программу обработки текста, в которой во многих местах используется литерная константа 26 – число букв в английском алфавите. Если у нас возникнет задача модифицировать ее для работы с алфавитом, в котором другое число букв (например, с русским), придется вносить исправления в большое число мест программы. При этом нет никакой гарантии, что не будет забыто какое-либо из необходимых исправлений, или случайно не будет "исправлено" на новое значение литерное выражение 26, не имеющее никакого отношения к числу букв алфавита. Оптимистам, считающим, что проблема решается поиском числа 26 по файлам проекта (в некоторых средах разработки такое возможно), приведу пример, когда это не поможет: символ подчеркивания "_" иногда (но не всегда) считается буквой. Поэтому в некоторых местах программы будет фигурировать число 27, а в некоторых 26. И исправления надо будет вносить как в одни, так и в другие места. Поэтому работа перестает быть чисто технической – при изменениях требуется вникать в смысл участка программы, и всегда есть шанс ошибиться.

Использование именованных констант полностью решают эту проблему. Если мы введем константу CHARS_COUNT=26, то вместо 27 будет записано CHARS_COUNT +1, и изменение значения CHARS_COUNT повлияет правильным образом и на это место программы. То есть достаточно внести одно изменение, и гарантированно получить правильный результат для всех мест программы, где необходимы исправления.

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Полетаев Дмитрий
Полетаев Дмитрий
Не очень понятно про оболочечные Данные,ячейки памяти могут наверно размер менять,какое это значение те же операции только ячейки больше,по скорости тоже самое
Максим Старостин
Максим Старостин

Код с перемещением фигур не стирает старую фигуру, а просто рисует новую в новом месте. Точку, круг.

Максим Лютов
Максим Лютов
Россия, СПб, Политех, 2012
Юлия Зубковская
Юлия Зубковская
Россия