Читать книгу JAVA 2021: лёгкий старт - Павел Александрович Забелин - Страница 9
Часть I
Глава 2. Данные
ОглавлениеПрограммирование – это процесс написания команд, которые потом будет выполнять компьютер, чтобы манипулировать данными. Основная причина, почему компьютеры стали очень распространенными устройствами – они умеют очень быстро обрабатывать огромные объемы данных. Любая задача для программиста – это задача про управление и преобразования данных, чтобы получить результат – другие данные. Соответственно данные надо где-то хранить: исходные данные, чтобы их прочитать и начать использовать, результаты – для сохранения промежуточных результатов (например, при очень сложных расчетах) или для финальных значений.
Данные, используемые программой, хранятся в памяти компьютера. Такая память называется оперативной памятью (и чем ее больше, тем быстрее работает компьютер, тем больше вкладок можно открыть в браузере :)). Память состоит из маленьких ячеек памяти. Каждая ячейка хранит одно значение 0 или 1, и называется бит. Принято считать, что 8 бит – это 1 байт. 1024 байта – это 1 килобайт. 1024 килобайт – это 1 мегабайт. 1024 мегабайт – это 1 гигабайт. Ну а потом уже следуют тера-, пета-, экса-…. байты.
Программисту, в процессе работы, приходится использовать большие и маленькие числа, которые могут занимать разное количество память. Для того, чтобы программа работала быстрее и старалась не использовать больше памяти, чем необходимо, программист использует типы данных.
Типы данных
Использование типов данных – это добровольное ограничение использования памяти. Например, программист знает, что в расчетах будет использоваться значение не больше 77, поэтому он использует тип данных short, для хранения этого значений. Для больших значений – соответственно другие типы данных. Вообще в Java существует 8 примитивных типов данных:
boolean – хранит один бит информации;
byte – хранит один байт информации, и соответственно целочисленные значения от -128 до 127 включительно;
short – хранит два байта информации, и соответственно целочисленные значение от -32768 до 32767 включительно;
int – хранит четыре байта информации, и соответственно целочисленные значение от -2147483648 до 2147483647 включительно;
long – хранит восемь байт информации, и соответственно целочисленные значения от – 9223372036854775808 (-2 в степени 63) до 9223372036854775807 (2 в степени 63 минус 1) включительно;
float – хранит четыре байта информации, и соответственно значения с плавающей точкой от 1.4х10—45 до 3.4х1038;
double – хранит восемь байт информации, и соответственно значения с плавающей точкой от 4.9х10—324 до 1.7х10308;
char – хранит 16 бит (2 байта), и соответственно символ в формате UTF.
То есть, когда нужно сохранить число 77 в памяти, и программист определил, что надо использовать для этого тип данных short, виртуальная машина Java выделит из общей памяти два байта.
В основном используют int и float, т.к. они покрывают большинство нужд.
Остается только один вопрос: как программист узнает где расположены эти два байта и как к ним обратиться. Именно для этого существуют переменные.
Переменные
Переменная – это указатель на область памяти определенного типа. Вы можете думать обо всем этом как о большом складе. Вы приходите на склад (вся свободная память компьютера) и говорите «мне нужно содержимое коробки с таким-то именем» (переменная) и заведующий склада (виртуальная машина Java) дает вам это содержимое. Также вы можете не только взять, но и положить туда то, что вам необходимо. Но если коробка маленькая, а вы пытаетесь засунуть туда большое содержимое – заведующий склада не даст вам это сделать и скажет, что вы ошибаетесь.
Несколько примеров как это выглядит в коде:
int box1;
int box2 = 70;
box1 = 50;
int box3 = box1 + box2;
System.out.println (box3);
В первой строке мы определяем переменную box1 типа int.
Во второй строке мы определяем переменную box2 типа int, при этом мы сразу кладем туда (или как говорят программисты «присваиваем») значение 100.
В третьей строке мы присваиваем переменной box1 значение 50 (программисты еще говорят «переменная box1 проинициализирована значением 50»). Если мы этого не сделаем, то получим ошибку на этапе компиляции нашей программы: компилятор скажет, что нельзя в программе использовать переменные, у которых нет значений.
В четвертой строке мы складываем содержимое box1 и box2 и присваиваем новой переменной box3 тоже типа int.
В пятой строке выводим на экран (или как еще говорят «распечатываем на экране») значение переменной box3 (120).
Как долго живут переменные?
Чем больше и сложнее программа, тем больше различных данных придется хранить в различных переменных. Причем зачастую нам нужны переменные только на какое-то время совершения какой-то операции или нескольких операций. Стоит ли хранить даже такие «временные переменные»? – конечно же нет. И как раз для этого была придумана «область видимости переменной», которое определяет, как долго переменная «будет жить», т.е. будет доступна для использования. На практике область видимости определяется фигурными скобками {} – переменная объявленная и проинициализированная внутри фигурных скобок «умирает» как только поток выполнения программы выйдет за эти скобки. Отсюда следует несколько областей видимости:
– локальная переменная объявленная внутри метода (доступна только внутри метода)
– переменная объявленная внутри класса (доступна только внутри объекта, порожденного из класса)
– статическая переменная класса (доступна все время, т.к. класс «живет» все время пока исполняется программа)