Глава 2. Ключевые слова, типы данных и переменные
В этой главе Вы узнаете о:
· ключевых словах Java
· типах данных в Java
· том, как организована память и как она используется переменными
Все языки программирования определяют множество ключевых слов, которые представляют инструкции компилятору, типы данных, которые определяют, как память выделяется под числа, символы и т. п., а также переменные, которые представляют именованные области памяти. В данной главе описывается, как это определено в языке Java.
Новичкам в программировании
Прежде, чем писать программы для компьютера, необходимо выучить ряд правил, по которым пишется программа. Есть два вида правил: синтаксические и семантические. Синтаксис определяет правила, по которым программа обрабатывается компилятором. Семантика определяет логику программы, то есть то, что Вы хотите, чтобы она выполняла.
Программирование на Java выглядит следующим образом:
1. Вы пишите программу нa Java и сохраняете ее в текстовый файл с расширением. java.
2. Компилятор Java читает программу и определяет, что она синтаксически верна и составлена в соответствии с правилами языка.
3. Компилятор Java генерирует новый файл с расширением .class, который содержит байт-код для Java Virtual Machine (JVM). Именно этот код и будет выполняться в виртуальной машине Java.
4. Java Virtual Machine выполняет байт-код.
5. Результат выполнения зависит от семантики Вашей программы.
В данной главе объясняется синтаксис языка Java.
Ключевые слова
Ключевые слова – это инструкции для компилятора Java. Эти слова не могут использоваться для обозначения имен переменных, так как они имеют определенные значения для компилятора.
Это следующие слова:
abstract
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
void
volatile
while
Каждое слово будет обсуждаься ниже, а пока знайте, что их нельзя использовать для обозначения переменных.
Типы данных
Тип данных определяет, как используется память компьютера. В программе тип данных указывает, какой размер памяти выделен под ту или иную переменную, а также, какие значения можно записывать в эту память.
Java - это строго типизированный язык программирования. Это означает, что все переменные в Java должны иметь определенный тип данных. В Java нельзя использовать одну и ту же переменную для присваивания ей различных тпов данных, как, например, в JavaScript.
Проблема взаимодействия человека и компьютера
Компьютеры и люди общаются на разных языках. Человек мыслит в терминах объектов, определяет числа, буквы, строки. В компьютере же все представляется просто 0 и 1.
Как же можно перевести числа, символы, слова так, чтобы их понял компьютер?
Так как компьютер не различает число 5 или букву B, мы должны придумать правила, по которым можно будет выполнять разные действия над ноликами и единичками, представляющими буквы и цифры. Мы можем образовать группу из 0 и 1, назвать ее байтом, и сказать, что это – буква. А как это сказать?
Английский алфавит имеет 26 букв. В байте – 8 разрядов, каждый принимает значение 0 или 1. Различных значений можно набрать 256. Если мы хотим иметь числа, причем и положительные и отрицательные, то один разряд надо занять под знак числа, тогда мы получим 127 положительных значений и 128 отрицательных значений. При этом числа представляются в так называемом дополнительном коде. Тогда диапазон чисел, представленных байтом, будет -128 - +127.
Система счисления в представлении чисел в компьютере – двоичная, а в обычном человеческом представлении – десятичная. Каждый бит в представлении числа в компьютере – это степень 2. Мы показали вес каждого разряда на рис. 2.1.
Рис. 2.1. Двоичные числа.

Как показано на рис. 2.1, мы можем вполне определенно преобразовать набор 0 и 1 в десятичные числа, а также выполнить и обратное преобразование. А если числа больше 128? Тогда с помощью байта число не представить, но можно создать группу битов длиной не в 8, а в 16. Если один бит – это знак числа, то диапазон представимых значений от –32768 до 32767.
Теперь мы можем определить типы данных, например, числа и символы. Числа мы будем представлять в виде 16-разрядных наборов, а символы – в виде байтов. Примерно так и определяются типы данных в Java и других языках. Обычно есть некоторые общие правила определения типов данных для всех языков программирования, иначе странно было бы, чтобы буква А в одном языке оказалась бы совсем другой буквой в другом языке программирования.
Примитивные типы данных
Java определяет восемь примитивных типов данных. Каждый тип задает диапазон значений и размер памяти под данные.
Типы данных для целых чисел
Целые – это числа без дроной части. В Java определены четыре типа данных:
byte
short
int
long
Все целые типы представлены так же, как мы видели чуть раньше. Самый старший бит – это знак числа, а младшие разряды представляют значения. Разница между различными целыми типами заключается в числе байтов, выделяемых под числа и соответственно диапазоном значений.
Табл. 2.1 показывает использование байтов и диапазон значений для каждого типа данных.
Табл. 2.1.Типы данных для целых чисел | ||
Тип | Размер в памяти | Диапазон значений |
byte | 1 byte (8 bits) | –128 to +127 (–27 to 27–1) |
short | 2 bytes (16 bits) | –215 to 215–1 |
int | 4 bytes (32 bits) | –231 to 231–1 |
long | 8 bytes (64 bits) | –263 to 263–1 |
Тип данных выбирается в зависимости от того, какие данные вы хотите представить. Например, для возраста человека можно выбрать тип byte или short, так не так много людей с возрастом, большим, чем 32767 лет. Ну а национальный доход лучше представить в виде long.
Здесь приведен пример задания переменных определенного типа и присваивания им значений:
byte b = 50;
short s = 1000;
int i = 500000;
long l = ;
Типы для числе с плавающей точкой
исла с плавающей точкой представлены теми же наборами 0 и 1, но интерпретируются по-другому. Некоторое количество битов используются для представления дробной части числа. При этом определяется точность представления данных. Например, число:
3.1428571
В этом числе 8 значащих цифр. А в числе
только две зачащих цифры. 0 – это не значащая цифра, если он не окружен другими ненулевыми цифрами. Обычно в математике число с плавающей точкой представляется в экспоненциальной форме. Тогда 120 миллионов можно записать так:
1.2 * 108 или 1.2E+8
Именно из этого представления определяется точность числа. Некоторое количество разрядов выделяется для представления порядка. Порядок определяет диапазон представления степени числа.
Есть два типа чисел с плавающей точкой в Java. Они приведены в таблице 2.2.
Табл. 2.2. Типы для чисел с плавающей точкой | ||
Числа с плавающей точкой | Размер в памяти | Диапазон значений |
float | 4 bytes (32 bits) | +/– 3.E+38 (6–7 значащих цифр) |
double | 8 bytes (64 bits) | +/– 1.E+значащих) |
Тип данных float обеспечивает большой диапазон значений, но точнойть всего 6 или 7 цифр. Для расчетов, связанных с большинством инженерно-финансовых задач, эта точность вполне достаточна. Если же необходима большая точность, то мохно использовать тип данных double.
Символьный тип данных
Ну, а теперь поговорим о представлении символов. Сколько символов необходимо представить? В английском языке есть 26 прописных букв, 26 строчных букв, 10 цифр и дополнительные знаки (+, -, /, * и т. д). В английском языке вполне достаточно 128 значений для представления всего множества символов.
В 1961 году была предложена схема представления символов, которая получила название таблица ASCII (American Standard Code for Information Interchange), а в 1968 году – таблица ANSI (American National Standards Institute). Рис. 2.2 демонстрирует таблицу ASCII.
Рис. 2.2. Таблица ASCII-кодов.

А как же представить другой язык? Необходимо каждой букве другого языка назначить свое численное значение. А как быть с различными языками, например, русским и японским?
Нам необходим больший диапазон представления символьных значений. В 128 различных значений другой язык, кроме английского, не вставить.
Различные компании предложили разные способы кодирования символов в разных языках, и в 1988 году был принят стандарт, названный Unicode. В настоящее время используется версия 3.0 этого стандарта. В стандарте на каждый символ отводится 2 байта (16 bits), что позволяет закодировать более 1 миллиона разных символов. Первые 128 символов совпадают с кодировкой по стандарту ASCII.
Java представляет все символы в Unicode (2 байта), при этом возможно использование символов всех языков, существующих на земле.
В кодировке Unicode любой символ может быть представлен в виде:
\uXXXX
где XXXX – это число в диапазоне от 0000 до FFFF (в шестнадцатиричной системе счисления).
Или любой символ можно записать в виде:
'a'
'Z'
'n'
'я'
Символы в такой записи ограничены одинарными кавычками (апострофами). Внутри апострофов можно использовать любую букву любого языка. Строки – наборы символов, ограничены двойными кавычками. Кроме того, имеются и так называемые непечатные символы. Эти символы приведены в табл. 2.3.
Табл 2.3.Специальные символы Java | ||
Символ | Значение | Кодировка в Unicode |
\b | Backspace | \u0008 |
\t | Tab | \u0009 |
\n | Linefeed | \u000a |
\r | Carriage Return | \u000d |
\" | Double quote | \u0022 |
\' | Single quote | \u0027 |
\\ | Backslash | \u005c |
Символы в Java представлены типом char.
Булевкие типы данных
Последний примитивный тип данных в Java - тип boolean. Этот тип принимает одно из двух значени: true или false. Это не строки, это просто ключевые слова Java.
Булевский тип используется для выполнения действий, связанных с вычислением каких-то условий. Например, светофор для организации перехода через улицу может находиться в состоянии «зеленый» - (true) или же в состоянии «красный» - (false).
Переменные
Типы данных определяют размер области памяти и диапазон знаяений. А как же сделать эту область памяти доступной? Сама память – это набор байтов, причем каждый байт имеет связанный с ним численный адрес. А если известен адрес, то можно получить связанное с ним значение. Если представить память как линейную последовательность пронумерованных байтов, начиная с 0, то можно представить данные в памяти, например, так, как показано на рис. 2.3.
Рис. 2.3. Данные в памяти.

Рис. 2.3 показывает упрощенный взгляд на то, как разположены в памяти данные типов char, двух int и short. Рассмотрим вычисление суммы двух целых чисел. Берем целое значение, лежащее по адресу 2 и занимающее 4 байта, добавляем его к целому, расположенному по адресу 8 и занимающему также четыре байта.
Пусть первое число – это количество студентов в группе 1, а второе число – количество студентов в группе 2.
Конечно, было бы удобнее оперировать не с адресами, а со значимыми обозначениями областей памяти.
Тогда можно было бы записать вычисление суммы примерно так::
group1 + group2
Здесь group1 – число студентов в первой группе, а group2 – число студентов во второй группе.
В Java можно определить значимый идентификатор на область памяти. Этот идентификатор обозначает переменную. При программировании можно не беспокоиться о том, по каким адресам расположены данные. За это отвечает виртуальная машина Java.
Обычно создание переменной называется объявление переменной и выглядит следующим образом:
datatype variableName;
Сначала задается тип данных, один из перечисленных в этой главе. Затем указывается имя переменной, обычно имеющее какое-то смысловое значение. Но при выборе имени переменной следует знать об ограничениях:
· Имя переменной (идентификатор) должно начинаться с буквы (от a до z, от A до Z или любой буквы в кодировке Unicode), или подчеркивания, или знака $.
· В имени можно использовать любые буквы, цифры, подчеркивание.
· Имя может быть любой длины.
· В имени нельзя использовать не алфавитно-цифровые символы вроде + или -, и т. п.
· Имя не может быть ключевым словом Java.
· Буквы различаются по регистру, то есть идентификатор myBook не равносилен идентификатору myBooK.
Обычно (так принято) идентификатор переменной начинается с маленькой буквы, и, если в имени несколько слов, то каждое следующее начинается с большой буквы. Например:
· thisIsMyVariableName
· classroomA
· totalNumberOfStudents
Все объявления переменных должны заканчиваться точкой с запятой.
Ниже приведены объявления переменных:
char c;
int numberOfStudentsInClassroom1;
float bankAccountBalance;
После того, как переменная объявлена, она может получить какое-то значение. Помните, что значение должно быть того типа, к которому принадлежит переменная. Присвоение значения в Java выполняется с помощью оператора присваивания (=). Например:
int myAge;
myAge = 30;
Строка кода Java называется предложением, и точка с запятой заканчивает каждое предложение в Java. Кроме того, можно присвоить значение переменной прямо при ообъявлении:
int myAge = 30;
Здесь переменная myAge, которая занимает четыре байта, имеет целый тип и получает значение 30.
Литералы (literal)
Литерал – это символ, или строка, или число, которые не изменяют значения, как переменные. Ниже приведены примеры литералов:
1.0
'c'
"Happy"
7
В выражении можно добавить 5 к целочисленной переменной:
int n = a + 5;
Вот здесь 5 - литерал.
При использовании численных литералов мы должны сказать компилятору, как значение представлять в памяти (какого типа значение). Если число записано в виде 1.0, компилятор считает его double—если мы хотим, чтобы оно было float, мы должны добавить f к нему. Например:
float f = 1.0f;
Если этого не сделать, то при компиляции будет выдано сообщение об ошибке, что возможна потеря точности, так как double занимает 8 байтов, а float – только четыре байта.
Преобразование численных типов
Переменные в Java могут использоваться в различных выражениях, например, в вычислениях с использованием математических операций: сложения, вычитания, умножения, деления. Обычная форма математической операции в Java:
operand operator operand
Здесь operand – это переменная или значение, а operator – знак операции. Рассмотрим следующую запись:
myApples + yourApples
Обычно результат помещается в любую переменную с помощью знака присваивания (=). Здесь складываются значения переменных myApples и yourApples. Если мы хотим записать результат в переменную totalApples, то запись будет выглядеть следующим образом:
int totalApples = myApples + yourApples;
При использовании численных типов (то есть int, float и т. д.) типы не обязательно должны быть одинаковыми, например, можно складывать целые и байты. Но что при этом происходит? Вспомним, что целое – это 4 байта, а байт - всего один байт. Пусть переменная байтовоготипа имеет значение 100, а переменная типа int - 1000. TРезультат будет 1100, но в байт такое значене не поместится.
В данном случае байт будет преобразован к типу int. Таковы правила выполнения операций в Java.
Эти правила следующие, причем выполняются они именно в указанном порядке:
1. Если один операнд имеет тип double, то второй преобразуется к этому типу.
2. Если один из операндов - float, то второй преобразуется к типу float.
3. Если один из операндов - long, то второй преобразуется к типу long.
4. Все остальные операнды преобразуются к типу int.
Преобразование выполняется от более узкого типа к более широкому, то есть short в int, так в более широком типе больше диапазон представления данных. Например, байт 10 в двоичном виде:
0
А в виде short:
010
Так, результат следующих операций - long:
long l = 10;
int i = 10;
byte b = 10;
long result = l + i + b;
Значения int и byte преобразуются в long перед выполнением операций.
Преобразование через присваивание
В следующем примере будет сгенерировано сообщение об ошибке:
byte b1 = 10;
byte b2 = 10;
byte result = b1 + b2;
Компилятор Java скажет, что "possible loss of precision" (возможна потеря точности) при преобразовании целого 10 в байт. Правило компилятора для преобразования примитивных типов определяет, что можно выполнять преобразование в более широкий тип, то есть можно преобразовывать:
1. byte—short, int, long, float, double
2. short—int, long, float, double
3. int—long, float, double
4. long—float, double
5. float—double
6. char—int
Например,:
int i = 10;
long l = i; // legal
double d = i; // legal
short s = i; // Illegal!
Преобразование типов данных
Java предлагает механизм для выполнения преобразования данных, который называется кастинг (casting) или явное указание преобразования. Кастинг позволяет выполнять преобразование даже при потере данных. Вы как будто говорите компилятору: « Я знаю, что делаю, преобразовывай!». Кастинг выполняется указанием типа преобразования в круглых скобках:
datatype variable = ( datatype )value;
Например:
int i = 10;
short s = ( short )i;
long l = 100;
byte b = ( byte )l;
Компилятор не выдаст сообщений об ошибке. Проверьте сами, что при таком преобразовании Вы не потеряете значимые данные.
Константы
Итак, мы знаем, что переменные представляют область памяти с данными определенного типа. Ну, а как представляются константы, например, число pi? Можно, конечно, записать pi так:
double pi = 3.14285
А при использовании его просто вставить pi:
double r = 10;
double area = pi * r * r;
Переменные могут изменять значения при пирсваивании, а значит, можно написать и так:
pi = pi / 2;
Это правильно с точки зрения компилятора Java, но мы то знаем, что pi не должно изменяться. В Java можно объявить идентификатор константой. В этом случае его нельзя будет изменять. Для такого объявления надо поставить ключевое слово final при объявлении переменной:
final double pi = 3.14285
Теперь, если Вы напишите нечто подобное:
final double pi = 3.14285
pi = pi / 2;
то компилятор выдаст сообщение об ошибке.
По общему соглашению, программисты обозначают константы идентификаторами с прописными буквами:
final double PI = 3.14285;
Заключение
В этой главе мы рассказали об основных понятиях Java-программирования: ключевых словах, типах данных и перменных. В следующей главе мы рассмотрим опреторы Java. Если провести аналогию со строительством дома, то мы знаем, из чего строится дом – кирпичики, брусочки. То, с чем мы познакомились в этой главе, - кирпичики Java. Операторы позволяют создать план строительства дома. Если Вы сможете создать хороший план, то и дом будет прочным, и стоять будет долго.
Контрольные вопросы
Что не является ключевым словом Java?a. int
b. label
c. continue
d. byte
В чем разница между синтаксисом и семантикой? Как данные представляются в компьютере? Что такое типы данных? В чем разница между short и int?6. Какие предложения верны? Если не верны, то почему?
short s1 = 10;
short s2 = 10;
short result = s1 + s2;
Как преобразуются численные типы данных? Какие типы преобразуются в short без явного указания преобразования (кастинга)? Что такое кастинг? Как сделать переменную константой?

