В этом уроке разберем что такое переменные и какие типы данных предоставляет нам язык Java.
Переменные
В предыдущих уроках нам встречалась конструкция вида
В этом коде мы говорим компьютеру:
- Выдели память, где мы будем хранить целые числовые значения
- Сразу запиши туда значение 0
- Дальше по коду мы везде будем ссылаться на эту память используя имя i
i - называется переменная, мы храним в ней переменные значения.
При создании переменной мы должны проинициализировать ее каким-то значением, иначе при попытке прочитать из переменной, получим ошибку на этапе компиляции.
Например вот такой код выполнится:
а вот такой выдаст ошибку:
В строчке System.out.println(i); пытаемся прочитать значение из переменной i и вывести на экран. Компилятор выдаст такое сообщение:
Error:(5, 28) java: variable i might not have been initialized
Примечание по поводу компилятора:
Мы пишем программу в редакторе (IDEA), дальше, когда мы запускаем ее в IDEA, то текст пропускается через компилятор, создается новый файл, который уже выполняется. (Компилятор - это отдельная программа, которая входит в комплект JDK.)
Константы
С помощью конструкции
мы можем задать константное значение. При попытке изменения значения такой переменной получим ошибку на этапе компиляции
С помощью двух слешей // отделяется коментарий в программе. Все что находится правее // игнорируется компилятором.
Тип переменной
В определении переменной
Первое слово int задает тип переменной. Типы можно разделить на три группы - примитивные (или примитивы), массивы и классы. Примитивные типы - те, что встроены в язык, массивы - это коллекции типов, классы - композиции примитивных типов, массивов, действий и др. классов.
Примитивные типы
Оператор деления
Хорошо видно отличие целых (int и т.д.) и дробных (double и т.д.) типов на примере деления:
результат деления целых чисел - целое число, результат деления дробных чисел - дробное число.
Порядок выполнения операторов
Чем выше в таблице, тем выше приоритет. Операторы из верхней строки таблицы выполняются в выражении в первую очередь.
заметьте, что правила пересекаются с правилами из арифметики 1 * 3 - 4 / 2 + 5, т.е. сначала выполняется умножение, деление, потом сложение, вычитание. Так же как в арифметике круглыми скобками можно менять порядок вычисления 1 * (3 - 4) / (2 + 5).
Приведение типов
В примере с интами, где мы делили 3 / 2, можно получить 1.5, если воспользоваться приведением типов. Нужно привести (скастовать) int к double:
В этом примере операция (double)i - это приведение значения переменной iк типу double. И дальше у нас операция деления двух double значений (дробных), результат тоже double (1.5).
Это явное приведение типов, когда мы явно указываем в коде что к чему приводим, но так же есть неявное приведение. Допустим тот же результат 1.5мы получим если явно приведем только одну переменную в выражении:
в выражении double z = (double)i / k переменная k неявно приведется к типу double.
За неявным приведением стоит простое правило - меньшие по размеру типы приводятся к большим. Можно руководствоваться схемой ниже.
Разберем пару выражений
что происходит в double z = y / k:
- в операции деления участвует два типа y - double, k - int
- чтобы произвести вычисление переменные приводятся к одному типу
- т.к. double больше int, то k кастуется в double (неявно)
- результат y / k тоже double
- записываем результат выражение y / k в переменную z
что происходит в double w = y / k - i / k :
- сначала выполняется выражение y / k (пусть результат temp1)
- дальше выполняется i / k (пусть результат temp2)
- потом выполняется temp1 - temp2
- и в финале результат присваивается переменной w
чуть подробнее
- выражение y / k разбирали выше, здесь у нас результат - тип double, значение 1.5
- выражение i / k - здесь у нас i int и k int, результат тоже int, значение 1 (инт у нас может содержать только целые числа, дробная часть отбрасывается)
- теперь получается выражение temp1 - temp2, где temp1 double значение 1.5 и temp2 int значение 1
- здесь уже начинает работать неявное приведение типов, temp2 приводится к типу double и вычисляется результат оператора " - "
- получаем 0.5
- записываем в переменную w
Блоки кода и область видимости переменной
Фигурные скобки определяют отдельный блок кода. Если переменная создается (определяется) внутри блока кода (после открывающей скобки), то она видна только в границах этого блока, освобождается после закрывающей скобки и дальше не видна.
Например:
или так:
Попробуем обратится к переменным за областью видимости:
Так же обратите внимание, что мы не можем два раза определить переменную
но можем определить с таким же именем в коде уровнем выше
добавим уровней вложенности
Если переменная уже определена, то мы не сможем создать такую же в блоке кода уровнем ниже
Полезные ссылки: