В Java четко определены области действия простых типов и диапазон допустимых для них значений. Эти правила должны соблюдаться при создании всех виртуальных машин. А поскольку программы на Java должны быть переносимыми, точное следование этим правилам является одним из основных требований языка. Например, тип int остается неизменным в любой исполняющей среде, благодаря чему удается обеспечить реальную переносимость программ. Это означает, что при переходе с одной платформы на другую не приходится переписывать код. И хотя строгий контроль типов может привести к незначительному снижению производительности в некоторых исполняющих средах, он является обязательным условием переносимости программ.
Таблица 2.1. Простые типы, встроенные в JavaТипОписаниеbooleanПредставляет логические значения true и falsebyte8-разрядное целое числоcharСимволdoubleЧисловое значение с плавающей точкой двойной точностиfloatЧисловое значение с плавающей точкой одинарной точностиintЦелое числоlongДлинное целое числоshortКороткое числоЦелочисленные типы данных
В Java определены четыре целочисленных типа данных: byte, short, int и long. Их краткое описание приведено ниже.ТипРазрядность, битДиапазон допустимых значенийbyte8от-128 до 127short16от -32,768 до 32,767int32от -2,147,483,648 до 2,147,483,647long64от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
Как следует из приведенной выше таблицы, целочисленные типы данных предполагают как положительные, так и отрицательные значения. В Java не поддерживаются целочисленные значения без знака, т.е. только положительные целые числа. Во многих других языках программирования широко применяются целочисленные типы данных без знака, но создатели Java посчитали их излишними.
На заметкуВ исполняющей системе Java для хранения простых типов может формально выделяться любой объем памяти, но диапазон допустимых значений остается неизменным.
Из всех целочисленных типов данных чаще всего применяется int. Переменные типа int нередко используются в качестве переменных циклов, индексов массивов и, конечно же, для выполнения универсальных операций над целыми числами.
Если диапазон значений, допустимых для типа int, не устраивает, можно выбрать тип long. Ниже приведен пример программы для расчета числа кубических дюймов в кубе, длина, ширина и высота которого равны одной миле./*Расчет числа кубических дюймов в кубе объемом в 1 милю.*/class Inches { public static void main(String args[]) { long ci; long im; im = 5280 * 12; ci = im * im * im; System.out.println("There are " + ci + " cubic inches in cubic mile."); }}
Результат выполнения данной программы выглядит следующим образом:There are 254358061056000 cubic inches in cubic mile.
Очевидно, что результирующее значение не умещается в переменной типа int.
Наименьшим диапазоном допустимых значений среди всех целочисленных типов обладает тип byte. Переменные типа byte очень удобны для обработки исходных двоичных данных, которые могут оказаться несовместимыми с другими встроенными в Java типами данных. Тип short предназначен для хранения небольших целых чисел. Переменные данного типа пригодны для хранения значений, изменяющихся в относительно небольших пределах по сравнению со значениями типа int.Типы данных с плавающей точкой
Как пояснялось в главе 1, типы с плавающей точкой могут представлять числовые значения с дробной частью. Существуют два типа данных с плавающей точкой: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно. Разрядность данных типа float составляет 32 бита, а разрядность данных типа double — 64 бита.
Тип double употребляется намного чаще, чем float, поскольку во всех математических функциях из библиотек классов Java используются значения типа double. Например, метод sqrt (), определенный в стандартном классе Math, возвращает значение double, являющееся квадратным корнем значения аргумента этого метода, также представленного типом double. Ниже приведен фрагмент кода, в котором метод sqrt () используется для расчета длины гипотенузы треугольника, при условии, что заданы длины катетов./*Определение длины гипотенузы, исходя из длины катетов по теореме Пифагора.*/class Hypot { public static void main(String args[]) { double x, y, z; x = 3; У = 4; // Обратите внимание на вызов метода sqrt(). Перед именем метода // указывается имя класса, членом которого он является. z = Math.sqrt(х*х + у*у); System.out.println("Hypotenuse is " + z) ; }}
Выполнение этого фрагмента кода дает следующий результат:Hypotenuse is 5.0
Как упоминалось выше, метод sqrt () определен в стандартном классе Math. Обратите внимание на вызов этого метода в приведенном выше фрагменте кода: перед его именем указывается имя класса. Аналогичным образом перед именем метода println () указывается имена классов System.out. Имя класса указывается не перед всеми стандартными методами, но для некоторых из них целесообразно применять именно такой способ.Символы
В отличие от других языков в Java символы не являются 8-битовыми значениями. Вместо этого в Java символы всех языков мира представлены в уникоде (Unicode). Таким образом, в Java тип char представляет 16-разрядное значение без знака в диапазоне от О до 65536. Стандартный набор 8-разрядных символов в коде ASCII является подмножеством уникода. В нем коды символов находятся в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему допустимы в Java.
Переменной символьного типа может быть присвоено значение, которое записывается в виде символа, заключенного в одинарные кавычки. В приведенном ниже фрагменте кода показано, каким образом переменной ch присваивается буква S.char ch;ch = 'S’;
Отобразить значение типа char можно с помощью метода println (). В приведенной ниже строке кода показано, каким образом этот метод вызывается для вывода на экран значения символа, хранящегося в переменной ch.System.out.println("This is ch:" + ch) ;
Тип char представляет 16-разрядное значение без знака, а это означает, что над пе ременной символьного типа можно производить различные арифметические операции. Рассмотрим в качестве примера следующую программу://С символьными переменными можно обращаться, как с целочисленными,class CharArithDemo { public static void main(String args[]) { char ch; ch = ' X' ; System.out.println("ch contains " + ch) ; ch++; // переменную типа char можно инкрементировать System.out.println("ch is now " + ch) ; ch = 90; // переменной типа char можно присвоить целочисленное значение System.out.println("ch is now " + ch) ; }}
Ниже приведен результат выполнения данной программы.ch contains Xch is now Ych is now Z
В приведенной выше программе переменной ch сначала присваивается значение кода буквы X. Затем содержимое ch увеличивается на единицу, в результате чего оно превращается в код буквы Y — следующего по порядку символа в коде ASCII (а также в уникоде). После этого переменной ch присваивается значение 90, представляющее букву Z в коде ASCII (и в уникоде). А поскольку символам в коде ASCII соответствуют первые 127 значений в уникоде, то все приемы, обычно применяемые для манипулирования символами в других языках программирования, вполне работоспособны и в Java.Логический тип данных
Тип boolean представляет логические значения “истина” и “ложь”, для которых в Java зарезервированы слова true и false соответственно. Следовательно, переменная или выражение типа boolean может принимать одно из этих двух значений.
Ниже приведен пример программы, демонстрирующий применение типа boolean в коде.// Демонстрация обращения с логическими значениями,class BoolDemo { public static void main(String args[]) { boolean b; b = false; System.out.println("b is " + b); b = true; System.out.println("b is " + b); // Логическое значение можно использовать для // управления условным оператором if. if(b) System.out.println("This is executed."); b = false; if(b) System.out.println("This is not executed."); // Логическое значение получается в результате // выполнения оператора отношения. System.out.println("10 > 9 is " + (10 > 9)); }}