Типы данных
Тип данных - это характеристика переменной или константы, определяющая, какого рода значение хранится в отведенной для нее области памяти: числовое (целое или вещественное), символьное, логическое, объект какого-либо класса или другое.
Каждый язык программирования предоставляет программисту несколько типов данных для представления различных значений переменных. Типы данных языка во многом определяют его возможности и круг задач, которые на этом языке можно решать. Типы данных и их использование - обширнейшая тема, которой можно было бы посвятить четверть этой книги, но мы ограничимся изложением только самых необходимых сведений.
Напомним, что Java - строго типизированный язык, из чего следует, в числе прочего, что любая переменная перед ее использованием должна быть объявлена с указанием ее типа.
Встроенные типы данных Java делятся на две категории: простые (primitive) и ссылочные (reference). К ссылочным типам относятся массивы, классы, интерфейсы и перечисления. Простые типы данных делятся на числовые (целые и вещественные) и логические, причем символьный тип относится к числовым.
Примечание
Такие естественные для программистов на других языках типы данных, как строковый и дата/время, реализованы в Java как ссылочные: классами string и Date.
Целочисленные типы
Для хранения целых чисел в Java предусмотрены четыре типа данных (табл. 2.1). Все они хранят целые числа со знаком. Беззнаковых числовых типов, как в C/C+ + , в языке Java нет.
Характеристики
целочисленных типов данных Таблица
2.1
Тип
Разрядность
Диапазон
значений
byte
8
битов
-128...127
short
16
битов
-32
768...32 767
int
32
бита
-2
147 483 648...2 147 483 647
long
64
бита
-9
223 372 036 854 775 808...9 223 372 036 854 775 807
Тип int (integer) используется чаще всего. Обычно именно этот тип имеют переменные цикла, индексы массива и т. п. Тип long предназначен для хранения чисел, выходящих за пределы диапазона int.
Меньше всего памяти занимает число типа byte - один байт. Это единственный тип данных в языке Java, который используется для побайтовой обработки двоичных данных.
Последний тип, short, отличается тем, что старший байт двухбайтового числа хранится в памяти первым. Так хранились целые числа на 16-разрядных компьютерах, а в наше 32-разрядное время этот тип данных почти вышел из употребления.
Символьный тип
К целочисленным типам относится и тип char, предназначенный для представления одного символа.
К хранению символов национальных алфавитов разработчики Java отнеслись с особым вниманием, потому что приложения, написанные на Java, должны были работать по всему миру. В отличие от большинства других языков, где символ занимает один байт, размер типа char в Java составляет 2 байта. Такой размер необходим для хранения символа по стандарту Unicode.
Unicode - это стандарт кодирования множества национальных алфавитов, видов письма, технических и математических символов, разработанный для того, чтобы разрешить проблемы интернационализации в многоязычной компьютерной среде. Более ранний стандарт ASCII, в котором каждый символ представлен одним байтом, был пригоден только для европейских языков. Таблица ASCII вошла в набор Unicode как его подмножество.
Собственно Unicode - это набор (последовательность) символов, который можно закодировать разными способами. Язык Java использует кодировку UTF-8, которая отводит по одному байту для букв западно-европейских алфавитов, по два байта - для восточноевропейских, а для алфавитов экзотических языков - три и более байтов. При этом строки, содержащие только 7-битные символы из первой половины таблицы ASCII, имеют одинаковое представление как в ASCII, так и в UTF-8.
Переменной типа char можно присвоить в качестве значения одиночный символ - как печатный, так и управляющий. Например, переменной ch можно присвоить букву L:
char ch; ch = 'L';
Вывести на консоль значение переменной типа char можно с помощью метода print In () ;
System.out.printIn("Значение переменной ch равно " + ch) ;
Поскольку тип данных char относится к целочисленным, над ним можно выполнять арифметические операции. Следующий пример демонстрирует применение операторов инкремента + + и декремента -.
Листинг 2.6. Операции инкремента и декремента над переменной символьного типа
// сохраните исходный код в файле с именем CharArithDemo.java public class CharArithDemo {
public static void main(String[] args) { char ch;
ch = 'L';
System.out.printing"ch равно " + ch); ch++;
System.out.printIn("значение ch изменилось на ", + ch) ;
ch = 'Д'; ch--;
System.out.println("значение ch снова изменилось
и равно " + ch) ;
} // main(String[])
} // CharArithDemo class
Эта программа выведет следующие строки:
ch равно L
значение ch изменилось на М значение ch снова изменилось и равно Г
Важное замечание: символ (‘А’) и строка из одного символа («А») — это совершенно разные вещи с точки зрения языка Java. Данные символьного и строкового типа хранятся в памяти по-разному.
Типы данных для вещественных чисел
Вещественное число, как известно, состоит из целой и дробной части, разделенных десятичной точкой. Для представления вещественных чисел Java располагает двумя типами данных: float и double. Первый из них предназначен для хранения чисел с 7-8 значащими цифрами, второй - для чисел с двойной точностью (15-16 значащих цифр).
Характеристики
вещественных типов данных Таблица 2.2
Тип
Разрядность
Диапазон
значений
float
32
бита
3.4е-38
... 3.4е+38
double
64
бита
1,7е-308
... 1,7е+308
Листинг 2.7. Пример работы с вещественными числами
// вычисление длины гипотенузы по теореме Пифагора public class HypotDemo {
public static void main(String[] args) { double cathetusl, cathetus2, hypot;
cathetusl =3; // длина первого катета cathetus2 =4; // длина второго катета
hypot = Math.sqrt((cathetusl * cathetusl) +
(cathetus2 * cathetus2));
System.out.printIn("длина гипотенузы равна " + hypot); } // main(String[])
} // class HypotDemo
Логический тип
Переменная типа boolean (логического) может принимать всего два значения: true (истина) и false (ложь). Для наглядности приведем небольшой пример:
Листинг 2.8. Демонстрация переменных логического типа
// пример использования типа данных boolean // сохраните в файл BoolDemo.java public class BoolDemo { public static void main(String[] args) {
boolean b;
b = false;
System.out.printIn("b равно " + b) ;
b = true;
System.out.printIn("b равно "+ b) ;
// переменная логического типа может стоять // в условии оператора if
if (b) System.out.printIn("Как вы думаете, увидите ли вы эту строку?");
// операторы сравнения возвращают логическое значение
System.out.printIn("Выражение 10 > 9 имеет значение "
+ (10 > 9) ) ;
} // main(Stringf] args)
} // BoolDemo class
Когда вы запустите программу BoolDemo, вы можете заметить, что метод println () выводит значение логического типа в виде строки true или false. Из листинга видно также, что при условном операторе не обязательно должно стоять логическое выражение - с таким же успехом интерпретатор Java может проверять значение переменной типа boolean. Благодаря этому отпадает необходимость писать громоздкие конструкции вроде:
if (b == true) System, out .println ( "true" )■ ;
/*хотя это тоже допустимо*/
В последней команде вывода метод print In () печатает значение не переменной, а логического выражения (10 > 9), возвращающего значение true. Забегая вперед, скажем, что выражение в данном случае должно быть взято в скобки, потому что оператор конкатенации строк «+» имеет более высокий приоритет, чем оператор сравнения «>».
