Переменные и константы в Java. Типы переменных в Java и какие когда стоит использовать

Мы уже и использовали переменные в наших примерах, поскольку без них было бы очень затруднительно объяснить примитивные типы данных в Java, но не акцентировали на этом внимания, так как это не большая и не сложная тема. О константах в Java мы вообще пока не говорили. И вот настало время! Ну погнали!

Переменная — основной компонент хранения данных в Java-программе. Переменная определяется комбинацией идентификатора, типа и необязательного начального значения. Кроме того, все переменные имеют область определения, которая задает их видимость для других объектов и время существования .

В Java все переменные должны быть объявлены до их использования. Объявить переменную можно в любом месте программы. Основная форма объявления переменных выглядит следующим образом:

тип идентификатор [=значение][, идентификатор [=значение] ...] ;

  • тип — это один из элементарных типов Java либо имя класса или интерфейса.
  • идентификатор — это имя переменной

Переменной можно присвоить начальное значение (инициализировать ее), указывая знак равенства и значение. Следует помнить, что выражение инициализации должно возвращать значение того же (или совместимого) типа, который указан для переменной. Для объявления более одной переменной указанного типа можно использовать список с разделителями-запятыми.

Несколько примеров объявления переменных различных типов приведено ниже. Обратите внимание, что некоторые объявления осуществляют инициализацию переменных.

a , b , c ; // объявление трех переменных типа int: a, b и c
int d = 3 , e , f = 5 ; // объявление еще трех переменных типа int с инициализацией d и f
byte z = 22 ; // инициализация переменной z
double pi = 3.14159 ; // объявление приблизительного значения переменной pi
char x = "x" ; // присваивание значения "x" переменной x

Использовать неинициализированную переменную в выражениях нельзя, поэтому переменную надо инициализировать либо при ее объявлении, либо до ее использования в каком либо выражении. Например, приведенный ниже фрагмент кода будет признан ошибочным уже на этапе компиляции.

vacationDays ;
System . out . println ( vacationDays ) ; // ОШИБКА! Переменная не инициализирована

Как правильно именовать переменные мы уже обсуждали.

Динамическая инициализация переменных

Java допускает динамическую инициализацию переменных посредством любого выражения, допустимого в момент объявления переменной. Например:

a = 3.0 , b = 4.0 ;
// динамическая инициализация переменной c
double c = Math . sqrt ( a * a + b * b ) ;
System . out . println ( "Гипотенуза равна " + c ) ;

Область действия и время существования переменных

Это достаточно важный вопрос и его надо рассмотреть поподробнее. И для этого сперва надо рассмотреть использование блоков кода в Java.

Использование блоков кода

Java позволяет группировать один и более оператора в блоки кода, называемые также кодовыми блоками. Это выполняется путем помещения операторов в фигурные скобки. Сразу после создания блок кода становится логическим модулем, который можно использовать в тех же местах, что и отдельный оператор. Например, блок может служить в качестве цели для операторов if и for. Рассмотрим следующий оператор if:

( x < y ) { // начало блока
x = y;
y = 0 ;
} // конец блока

В этом примере, если x меньше y, программа выполнит оба оператора, расположенные внутри блока. Таким образом, оба оператора внутри блока образуют логический модуль, и выполнение одного оператора невозможно без одновременного выполнения и второго. Основная идея этого подхода состоит в том, что во всех случаях, когда требуется логически связать два или более оператора, это делается посредством создания блока.

Java допускает объявление переменных внутри любого блока. Блок начинается открывающей фигурной скобкой и завершается закрывающей фигурной скобкой. Блок задает область определения. Таким образом, приоткрытии каждого нового блока мы создаем новую область действия . Область действия задает то, какие объекты видимы другим частям программы. Она определяет также время существования этих объектов.

Основное правило, которое следует запомнить: переменные, объявленные внутри области действия, не видны (т.е. недоступны) коду, который находится за пределами этой области. Таким образом, объявление переменной внутри области действия ведет к ее локализации и защите от несанкционированного доступа и/или изменений.

Области действия могут быть вложенными . Например, при каждом создании блока кода мы создаем новую, вложенную область действия. В этих случаях внешняя область действия заключает в себя внутреннюю область . Это означает, что объекты, объявленные во внешней области, будут видны коду, определенному во внутренней области . Тем не менее, обратное не верно. Объекты, которые объявлены во внутренней области действия, не будут видны за ее пределами . Это может пояснить следующий пример:

Переменная y , определенная внутри своей области действия ограниченной фигурными скобками, доступна только в ней. За ее пределами переменная y уже не доступна, а переменная x доступна, и во области действия переменной y .

Следует запомнить еще один важный нюанс: переменные создаются при входе в их область действия и уничтожаются при выходе из нее.

Это означает, что переменная утратит свое значение сразу по выходу из области действия.

Хотя блоки могут быть вложенными, во внутреннем блоке нельзя объявлять переменные с тем же именем, что и во внешней области .

Код приведенный на примере слева, выдаст ошибку компиляции.

Такие трюки возможные в C и C++ в Java не проходят.

Константы в Java

В Java для обозначения констант служит ключевое слово final . Ключевое слово final означает, что присвоить данной переменной какое-нибудь значение можно лишь один раз, после чего изменить его уже нельзя. Рекомендуется использовать для именования констант прописные буквы, хоть это и не является обязательным, но такой стиль способствует удобочитаемости кода. Пример объявления константы:

double CM_PER_INCH = 2.54 ;

Константу можно и не инициализировать при ее объявлении, но необходимо инициализировать до ее использования в каком-либо выражении, точно так же как и переменную, но сделать это можно только один раз. Причем это можно сделать и в условных операторах, то есть инициализировать значение константы в зависимости от каких либо условий. Компилятор проверит все возможные варианты, и если будет хоть один, где константа может быт не инициализирована, то он выдаст ошибку.

Переменная - это основной элемент хранения информации в Java- программе. Переменная характеризуется комбинацией идентификатора, типа и области действия. В зависимости от того, где объявлена переменная, она может быть локальной, например, для кода внутри метода, либо это может быть переменная экземпляра класса, доступная всем методам данного класса. Локальные области действия объявляются с помощью фигурных скобок.

1.1. Объявление переменных

Все переменные должны быть объявлены до первого их использования в программе. Основная форма объявления переменной такова:

тип идентификатор [ = значение] [, идентификатор [ = значение ]...];

Тип - это либо один из встроенных типов, либо имя класса или интерфейса. Ниже приведено несколько примеров объявления переменных различных типов. Обратите внимание на то, что некоторые примеры включают в себя инициализацию начального значения. Переменные, для которых начальные значения не указаны, автоматически инициализируются нулем.

Таблица 1.1. Объявление переменных различных типов

Вид переменной

int а, b, с;

Объявляет три целых переменных а, b, с

int d = 3, е, f = 5;

Объявляет еще три целых переменных, инициализирует d и f

byte z = 22;

Объявляет переменную z типа byte и инициализирует ее

double pi = 3.14159;

Объявляет переменную pi типа double и инициализирует ее числом пи

char x = "x";

Символьная переменная х получает значение "х"

Идентификатор – это наименование переменной. В качестве идентификатора может использоваться любая последовательность строчных и прописных букв, цифр и символов _ (подчеркивание) и $ (доллар). Идентификаторы не должны начинаться с цифры.

Значение - это любой литерал или выражение, результатом которого является значение того же (или совместимого с указанным в объявлении переменной) типа. В приведенном ниже примере создаются три переменные, соответствующие сторонам прямоугольного треугольника, а затем с помощью теоремы Пифагора вычисляется длина гипотенузы, в данном случае числа 5, величины гипотенузы классического прямоугольного треугольника со сторонами 3-4-5.

class Variables {
public static void main (String args ){
double a = 3;
double b = 4;
double c;
с = Math.sqrt (a* a + b* b);
System.out.println ("c = "+ c);
}

1.2. Область видимости переменной

Блоки составных операторов в Java отмечаются парой фигурных скобок {}. Переменные в Java начинают действовать с того места в программе, где они объявлены до конца содержащего их блока. Блоки могут быть вложены друг в друга, и у каждого может быть свой собственный набор локальных переменных.

Числовые типы - это типы, предназначенные для хранения чисел. Когда вы выполняете математические операции, вы имеете дело с числовыми значениями. Существует два вида числовых типов. Те, которые предназначены для хранения чисел без дробной части, называются целыми типами, а те, в которых может храниться и дробная часть числа - вещественными, или типами с плавающей точкой.

В языке Java понятие беззнаковых чисел отсутствует. Все числовые типы этого языка - знаковые. Например, если значение переменной типа byte равно в шестнадцатиричном виде 0x80, то это число -1.

2.1.1.1. Целые типы

Отсутствие в Java беззнаковых чисел вдвое сокращает количество целых типов. В языке имеется 4 целых типа, занимающих 1, 2, 4 и 8 байтов в памяти. Для каждого типа - byte, short, int и long - есть свои естественные области применения.

Тип byte

Тип byte - это знаковый 8-битовый тип. Его диапазон - от -128 до 127. Он лучше всего подходит для хранения произвольного потока байтов, загружаемого из сети или из файла,

byte b;
byte с = 11;

Если речь не идет о манипуляциях с битами, использования типа byte, как правило, следует избегать. Для нормальных целых чисел, используемых в качестве счетчиков и в арифметических выражениях, гораздо лучше подходит тип int.

Тип short

Short - это знаковый 16-битовый тип. Его диапазон - от -32768 до 32767. Это, вероятно, наиболее редко используемый в Java тип, поскольку он определен как тип, в котором старший байт стоит первым,

short s;
short t= 129;
Тип int

Тип int служит для представления 32-битных целых чисел со знаком. Диапазон допустимых для этого типа значений - от -2147483648 до 2147483647. Чаще всего этот тип данных используется для хранения обычных целых чисел со значениями, достигающими двух миллиардов. Этот тип прекрасно подходит для использования при обработке массивов и для счетчиков. В ближайшие годы этот тип будет прекрасно соответствовать машинным словам не только 32-битовых процессоров, но и 64-битовых с поддержкой быстрой конвейеризации для выполнения 32-битного кода в режиме совместимости. Всякий раз, когда в одном выражении фигурируют переменные типов byte, short, int и целые литералы, тип всего выражения перед завершением вычислений приводится к int.

int j = 1000;
Тип long

Тип long предназначен для представления 64-битовых чисел со знаком. Его диапазон допустимых значений достаточно велик даже для таких задач, как подсчет числа атомов во вселенной,

long m;
long n = 123;

He надо отождествлять разрядность целочисленного типа с занимаемым им количеством памяти. Исполняющий код Java может использовать для ваших переменных то количество памяти, которое сочтет нужным, лишь бы только их поведение соответствовало поведению типов, заданных вами.

Таблица 2.1. Таблица разрядностей и допустимых диапазонов для различных типов целых чисел

Разрядность

Диапазон

-9, 223, 372,036, 854, 775, 808 ... 9, 223, 372, 036, 854, 775, 807

-2, 147, 483, 648 .... 2, 147, 483, 647

-32,768 .... 32, 767

-128 ... 127

2.1.1.2. Числа с плавающей точкой

Числа с плавающей точкой, часто называемые в других языках вещественными числами, используются при вычислениях, в которых требуется использование дробной части. В Java реализован стандартный (IEEE-754) набор типов для чисел с плавающей точкой - float и double и операторов для работы с ними.

Таблица 2.2. Характеристики типов чисел с плавающей точкой

Разрядность

Диапазон

1.7e-308 .... 1 .7e+ 308

3.4e-038 .... 3.4e+ 038

Тип float

В переменных с обычной, или одинарной точностью, объявляемых с помощью ключевого слова float, для хранения вещественного значения используется 32 бита,

float f;
float f2 = 3.14;
Тип double

В случае двойной точности, задаваемой с помощью ключевого слова double, для хранения значений используется 64 бита. Все трансцендентные математические функции, такие как sin, cos, sqrt, возвращают результат типа double,

double d;
double pi = 3.14159265358979323846;

Давайте сегодня по-быстрому разберемся с типами в Java. Все типы в Java делятся на две группы — это примитивные и ссылочные типы.

Здесь будем разбираться с примитивными типами.

Ну пожалуй самый примитивный тип — это логический тип данных. Он же boolean — самый простой тип данных. Переменная такого типа может хранить лишь два значения: true (истина) или false (ложь). С переменными такого типа можно проводить следующие опреации: «!» — отрицание (not), «&&» — логическое И (and), «||» — логическое ИЛИ (or), «^» — исключающе ИЛИ (xor). Таблицы истинности для этих операций можно .

Дальше целочисленные типы данных. К ним в Java относятся следующие типы: byte , short , int и long . Каждый из этих типов принимает разный диапазон значений, объединяет их только то, что все значения всегда целочисленные. Так для типа byte интеравал от?128 до 127, для типа short от?32768 до 32767, для типа int от?2147483648 до 2147483647 ну и для типа long интервал от?9.2·10 18 до 9.2·10 18 . C ними все просто вычитаем, складываем, делим, умножаем…

Ну и конечно есть типы данных с плавающей запятой, дробные типы. Это float и тип с двойной точностью double . float принимает значения в диапазоне приблизительно от?3.4·10 38 до 3.4·10 38 , а double в диапазоне от?1.8·10 308 до 1.8·10 308 . Помимо этого, для этих типов существуют особые значения +? — плюс бесконечность, -? — минус бесконечность и NaN — не число (например при делении на 0).

Итак, если мы хотим объявить переменную какого-то типа, мы должны указать сначала ее тип, а потом ее имя:

Int i; float f;

Так же сразу можно указать начальное значение:

Int i = 0; float f = 3.5;

В Java используется неявное преобразование типов. Что это такое? Ну например вы хотите сложить две переменные одна типа int а другая типа float. Тогда ваша переменная типа int будет преобразована к типу float и только после этого произойдет сложение. Соответственно и результат получится типа float. При этом меньший тип всегда преобразуется к бльшему, а целое к дробному. Ну например вот это будет работать:

Int a = 3; float b = 4.5, c; с = a + b;

а вот это нет:

Int a = 3, c; float b = 4.5; с = a + b;

Здесь переменная в которую записывается результат имеет тип int, а сам результат получится типа float. Конечно можно привести один тип к другому вручную. Делается это вот так:

Int a = 3, c; float b = 4.5; c = (int) (a + b);

здесь с помошью записи (int) мы приводим сумму a и b к типу int. Однако понятно, что в целочисленной переменной с не может храниться значение 7.5. При приведении дробных типов к целым дробная часть просто откидывается . Это может послужить причиной некотороых ошибок, поэтому об этом не стоит забывать.

Java является объектно-ориентированным языком, которому свойственна абстракция, однако для прикладных задач всегда приходится оперировать известными параметрами. В программировании они называются переменными. Чем java переменная отличается от объекта?

Всё просто – переменная является ячейкой в памяти, где хранится её значение. Любое действие – прямая работа с этим участком памяти. Объект же является более комплексной величиной. Он занимает определённый диапазон памяти, взаимодействие осуществляется через некую передаточную функцию (методы), выраженную в параметрах объекта.
В данной статье мы поговорим именно о переменных, здесь это совсем не тривиальное понятие.

Объявляются переменные java так:

тип_данных имя_переменной;

Здесь же при объявлении можно присвоить значение.

тип_данных имя_переменной = значение_переменной;

Также можно объявить одновременно несколько переменных, просто перечисляя их через запятую.

тип_данных имя_переменной1, имя_переменной2…;

Классификация по принадлежности

Выделяется четыре типа java переменных:

  • переменные экземпляра (instance variables);
  • переменные класса (class variables);
  • локальные переменные (local variables);
  • параметры (parameters).

Пусть у нас есть несколько объектов одного класса Automobile(). Помимо общих параметров у них есть уникальные, скажем, максимальная скорость maxSpeed(). Их можно инициировать в теле программы, а можно хранить в нестатических полях класса (объявленных без добавления слова static). Таким образом, каждый экземпляр будет обладать индивидуальным параметром, не зависящим от скоростей других объектов.

public class Automobile { public String name; private double maxSpeed ; public Automobile (String autoName ){ name = autoName; }}

Переменная класса, или статическая переменная java, напротив, объявляется исключительно с применением слова static. В данном случае её значение будет одинаковым для всех экземпляров. В случае того же автомобиля, введём параметр gearsNum – число передач. Для всех экземпляров оно будет равно 6.

Необязательный модификатор final позволяет присвоить значение переменной только один раз. За соблюдением этого следит компилятор.

public class Automobile { public String model ; private double maxSpeed ; public static final int gearsNum = 6 ; }

Локальные переменные и методы в java неизменно связаны. В последних часто фигурируют вспомогательные параметры, которые в дальнейшем коде не нужны. Для объявления локальной переменной нет особой формы инициализации, границы её действия зависят лишь от места объявления. В данном случае - в фигурных скобках внутри метода. При выходе из него переменная будет уничтожена, поэтому обратиться к ней будет уже нельзя.

Крайний случай локальных переменных - это параметры. В частности, классический пример «Hello, World!»:

class HelloWorld { public static void main (String args ) { System . out. println("Hello World!" ); } }

Здесь сразу два параметра. Первая - собственно, «Hello, World!», вторая - аргумент строки args в main.

Классификация по видимости

На основании описанного выше, можно проследить ещё одно деление – по видимости переменных. Существует 4 группы:

  • Public. Данный модификатор переменных доступен всем классам и объектам программы. Объявляется при помощи ключевого слова public в начале строки.
  • Protected. Области видимости java переменных в этом случае ограничены текущим пакетом и подклассами. Объявляется аналогично - ключевым словом protected.
  • Package protected. Модификатор переменных, доступных только внутри пакета. Объявления не требуется, отсутствие ключевых слов указывает на package protected.
  • Private. Переменные, доступные исключительно внутри класса. В данном случае, определить тип переменной можно по ключевому слову private.

Несмотря на то, что приватные элементы доступны внутри класса, вопрос: «как обращаться к private java переменным?» всё же имеет ответ. Для того, чтобы иметь возможность извне поменять значение приватного параметра, достаточно внутри того же класса создать публичный метод. Например так:

class Drive { private int gears; public void setGears (int val ) { gears = val; } }

Таким образом, в случае необходимости вы легко сможете изменить значение private переменной.

Указатели - ещё один вариант глобальных переменных. Вспомните, для создания экземпляра объекта мы используем следующую запись:

класс_объекта имя_указателя = new класс_объекта;

Такие переменные называются ссылочными переменными.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: