область видимости и время жизни переменных java
Области видимости и модификаторы доступа
Область видимости переменной, метода или класса – это их свойство быть доступными из тех или иных частей кода, т. е. различных областей программы. Область видимости может определяться как самим местом объявления идентификатора, так и применением к нему модификатора доступа.
Отдельно следует отметить модификатор static, который регулирует не область видимости, а обозначает статические переменные и методы, которые существуют без необходимости создания объекта, обращаться к ним следует через имя класса. Статические переменные существуют все время работы программы, однако это не мешает регулировать область их видимости модификаторами доступа.
Если переменная объявляется в теле метода, в цикле или условной конструкции, то она исчезает после завершения работы метода, цикла или ветки. То же самое касается аргументов методов, переменные-аргументы существуют только в момент выполнения метода. Следовательно, такие локальные переменные не могут быть доступными из других блоков кода. Модификаторы доступа здесь не используются.
Переменные-поля и методы (не статические) объекта существуют только в период жизни этого объекта. При этом их область видимости регулируется модификаторами. Классы существуют всегда, к ним также применяются модификаторы доступа, но не все.
В программах на языке Java часто используют два модификатора доступа – public и private. Реже – protected. Кроме того, есть так называемый модификатор по умолчанию, который используется, когда не указан ни один другой.
Если к полю, методу или классу применен модификатор public, к ним можно обращаться из любого места программы. То есть public-сущности доступны любым другим классам как в текущем пакете, так и за его пределами. Данное положение не отменяет необходимости импорта пакета.
Модификатор private применяется к переменным или методам, по отношению к классам не имеет смысла. К таким private-сущностям можно обращаться только из того же класса, где они объявлены. Для всех остальных классов, в том числе дочерних, такие поля и методы остаются невидимыми.
Если никакой модификатор не используется, считается, что используется модификатор по умолчанию. Классы, поля или методы с таким модификатором видны всем классам пакета, в котором они объявлены. Другими словами, видны в пределах текущего каталога.
Модификатор protected схож с модификатором по умолчанию, за одним исключением. Поля и методы доступны не только в пределах пакета, но и в классах-наследниках, т. е. производных классах, даже если они находятся в другом пакете.
Таким образом степень приватности увеличивается так: public → protected → default → private.
Рассмотрим пример. Файл Main.java:
Оба файла находятся в одном каталоге, т. е. принадлежать одному пакету. Поэтому в классе Book можно не использовать модификатор public, чтобы предоставить доступ к Book классу Main. Метод testPage может использоваться только внутри класса Book.
Если бы в каталог, где находятся Main.java и Book.java, был вложен другой каталог-пакет с классами, то эти классы должны были бы иметь модификатор public для доступа к ним из Main.
Таким образом, классы в Java могут иметь модификатор public, либо не иметь явно указанного модификатора. У полей и методов может быть один из четырех, считая модификатор по умолчанию. Однако объявление публичного метода в непубличном классе вряд ли имеет смысл.
Также не следует забывать про модификатор static, который, если используется, пишется после модификатора доступа. Следом указывается тип переменной или возвращаемое методом значение. Далее идут имя переменной или метода. Если метод ничего не возвращает используется ключевое слово void.
Переменные Java
переменные
Переменная является основной единицей хранения в программе Java. Переменная определяется комбинацией идентификатора, типа и необязательного инициализатора. Кроме того, все переменные имеют область видимости, которая определяет их видимость и время жизни. Эти элементы рассматриваются далее.
Объявление переменной
В Java все переменные должны быть объявлены перед использованием. Основная форма объявления переменной показана здесь:
пример
int d = 3, e, f = 5; // объявляет еще три целых числа, инициализируя // d и f.
байт z = 22; // инициализирует z.
двойной пи = 3,14159; // объявляет приближение числа пи
char x = ‘x’; // переменная x имеет значение ‘x’.
логическое d = ложь; // логическое значение, инициализированное значением false;
Выбранные вами идентификаторы не имеют ничего общего с их именами
Динамическая инициализация
Хотя в предыдущих примерах в качестве инициализаторов использовались только константы, Java позволяет динамически инициализировать переменные, используя любое выражение, действительное на момент объявления переменной. Пример программы для инициализации динамической переменной:
Область действия и время жизни переменных
Пока что все используемые переменные были объявлены в начале метода main (). Однако Java позволяет объявлять переменные в любом блоке. Блок определяет область. Таким образом, каждый раз, когда вы начинаете новый блок, вы создаете новую область. Область действия определяет, какие объекты видны другим частям вашей программы. Это также определяет время жизни этих объектов.
В Java существует три вида переменных, основанных на области действия и времени жизни.
Локальная переменная: Локальные переменные объявляются в методах, конструкторах или блоках.
Глобальная переменная / переменная экземпляра: переменные экземпляра объявляются в классе, но вне метода, конструктора или любого блока.
Переменная экземпляра также является переменной объекта, обычно называемой полем или свойством. Они называются объектной переменной. Каждый объект имеет свою собственную копию каждой переменной, и, следовательно, он не влияет на переменную экземпляра, если один объект изменяет значение переменной.
Здесь имя и возраст являются переменными экземпляра класса Student.
Класс / Статические переменные: переменные класса, также известные как статические переменные, объявляются с ключевым словом static в классе. Статические переменные также используются при объявлении константы вместе с последним ключевым словом. подробнее о статической переменной мы рассмотрим в следующих главах
Область применения программы с примером программы
Внутри блока переменные могут быть объявлены в любой точке, но они действительны только после их объявления. Если вы определяете переменную в начале метода, она доступна для всего кода в этом методе.
Область видимости переменных в Java
Разбираемся, что такое, как работает и в чем особенности использования.
Область видимости переменной — свойство, которое определяет, можно ли использовать переменную из разных областей класса. Это зависит от места, где переменная была объявлена.
Если какая-то переменная объявляется в теле метода, в цикле или условной конструкции, она исчезает после завершения работы этого метода, цикла или ветки. Это же касается и аргументов методов: переменные-аргументы существуют только в момент выполнения метода. А значит, они не могут быть доступны из других блоков кода.
Преподаватель Skillbox. Пишет про Java, учит Go. Помнит рассвет PHP и как «грабить корованы».
Область видимости внутри метода
Рассмотрим пример кода метода main ():
В начале метода объявляются переменные money, priceCappuchino, priceEspresso, и инициализируются — устанавливается их значение.
Все три переменные доступны для использования в любой строке этого метода — начиная со строки объявления переменной и заканчивая закрывающейся > метода. Это позволяет использовать эти переменные в блоках if для расчёта суммы оставшихся денег.
Начало области видимости
Область видимости переменной начинается с момента объявления — использовать переменную до её объявления невозможно.
На скриншоте область видимости переменной money выделена зелёным цветом:
Рассмотрим переменные change внутри условных операторов if. Область видимости переменных ограничена <>, в которых они находятся. Это значит, что каждая из двух change работает только внутри своего блока if, а в следующем существует уже другая переменная, но с тем же именем.
Важно, что переменные change — это две совершенно разные переменные. Области видимости позволяют в непересекающихся блоках кода создавать и использовать переменные с одинаковыми именами.
Доступность переменной ограничена областью видимости
Переменная уничтожается после выхода из её области видимости, и далее к ней доступа нет.
При попытке использовать переменные за пределами цикла и скомпилировать код мы получим ошибку компиляции:
Область видимости аргументов метода — тело метода
В примере у метода main () один аргумент в виде массива String[] args. Его область видимости — всё тело метода.
Цикл for
Возьмём пример кода:
В цикле объявляется и инициализируется переменная i, которая используется при проверке условия и увеличивается на 10 при каждой итерации.
Область видимости переменной i ограничена телом цикла for, то есть <> после условия цикла. Переменная i будет уничтожена после завершения цикла:
Область видимости переменных внутри класса
Внутри класса область видимости зависит от типа переменной:
Разберём область видимости каждой из переменных:
Ключевое слово this
Если посмотреть на конструктор класса Car, то переменная, которую передают в аргументе конструктора, названа таким же именем, как и параметр класса. В этом случае области видимости переменной consumption класса и аргумента конструктора consumption пересекаются. По умолчанию используется переменная с более узкой областью видимости, то есть аргумент метода. Чтобы использовать переменную класса, необходимо на неё явно указать с помощью ключевого слова this.
Переменные в Java
Java является объектно-ориентированным языком, которому свойственна абстракция, однако для прикладных задач всегда приходится оперировать известными параметрами. В программировании они называются переменными. Чем java переменная отличается от объекта?
Всё просто – переменная является ячейкой в памяти, где хранится её значение. Любое действие – прямая работа с этим участком памяти. Объект же является более комплексной величиной. Он занимает определённый диапазон памяти, взаимодействие осуществляется через некую передаточную функцию (методы), выраженную в параметрах объекта.
В данной статье мы поговорим именно о переменных, здесь это совсем не тривиальное понятие.
Объявляются переменные java так:
Здесь же при объявлении можно присвоить значение.
тип_данных имя_переменной = значение_переменной;
Также можно объявить одновременно несколько переменных, просто перечисляя их через запятую.
тип_данных имя_переменной1, имя_переменной2…;
Классификация по принадлежности
Выделяется четыре типа java переменных:
Пусть у нас есть несколько объектов одного класса Automobile(). Помимо общих параметров у них есть уникальные, скажем, максимальная скорость maxSpeed(). Их можно инициировать в теле программы, а можно хранить в нестатических полях класса (объявленных без добавления слова static). Таким образом, каждый экземпляр будет обладать индивидуальным параметром, не зависящим от скоростей других объектов.
Переменная класса, или статическая переменная java, напротив, объявляется исключительно с применением слова static. В данном случае её значение будет одинаковым для всех экземпляров. В случае того же автомобиля, введём параметр gearsNum – число передач. Для всех экземпляров оно будет равно 6.
Необязательный модификатор final позволяет присвоить значение переменной только один раз. За соблюдением этого следит компилятор.
Локальные переменные и методы в java неизменно связаны. В последних часто фигурируют вспомогательные параметры, которые в дальнейшем коде не нужны. Для объявления локальной переменной нет особой формы инициализации, границы её действия зависят лишь от места объявления. В данном случае — в фигурных скобках внутри метода. При выходе из него переменная будет уничтожена, поэтому обратиться к ней будет уже нельзя.
Крайний случай локальных переменных — это параметры. В частности, классический пример «Hello, World!»:
Здесь сразу два параметра. Первая — собственно, «Hello, World!», вторая — аргумент строки args в main.
Классификация по видимости
На основании описанного выше, можно проследить ещё одно деление – по видимости переменных. Существует 4 группы:
Несмотря на то, что приватные элементы доступны внутри класса, вопрос: «как обращаться к private java переменным?» всё же имеет ответ. Для того, чтобы иметь возможность извне поменять значение приватного параметра, достаточно внутри того же класса создать публичный метод. Например так:
Таким образом, в случае необходимости вы легко сможете изменить значение private переменной.
Указатели — ещё один вариант глобальных переменных. Вспомните, для создания экземпляра объекта мы используем следующую запись:
класс_объекта имя_указателя = new класс_объекта;
Такие переменные называются ссылочными переменными.
Java является объектно-ориентированным языком, которому свойственна абстракция, однако для прикладных задач всегда приходится оперировать известными параметрами. В программировании они называются переменными. Чем java переменная отличается от объекта?
Всё просто – переменная является ячейкой в памяти, где хранится её значение. Любое действие – прямая работа с этим участком памяти. Объект же является более комплексной величиной. Он занимает определённый диапазон памяти, взаимодействие осуществляется через некую передаточную функцию (методы), выраженную в параметрах объекта.
В данной статье мы поговорим именно о переменных, здесь это совсем не тривиальное понятие.
Объявляются переменные java так:
Здесь же при объявлении можно присвоить значение.
тип_данных имя_переменной = значение_переменной;
Также можно объявить одновременно несколько переменных, просто перечисляя их через запятую.
тип_данных имя_переменной1, имя_переменной2…;
Классификация по принадлежности
Выделяется четыре типа java переменных:
Пусть у нас есть несколько объектов одного класса Automobile(). Помимо общих параметров у них есть уникальные, скажем, максимальная скорость maxSpeed(). Их можно инициировать в теле программы, а можно хранить в нестатических полях класса (объявленных без добавления слова static). Таким образом, каждый экземпляр будет обладать индивидуальным параметром, не зависящим от скоростей других объектов.
Переменная класса, или статическая переменная java, напротив, объявляется исключительно с применением слова static. В данном случае её значение будет одинаковым для всех экземпляров. В случае того же автомобиля, введём параметр gearsNum – число передач. Для всех экземпляров оно будет равно 6.
Необязательный модификатор final позволяет присвоить значение переменной только один раз. За соблюдением этого следит компилятор.
Локальные переменные и методы в java неизменно связаны. В последних часто фигурируют вспомогательные параметры, которые в дальнейшем коде не нужны. Для объявления локальной переменной нет особой формы инициализации, границы её действия зависят лишь от места объявления. В данном случае — в фигурных скобках внутри метода. При выходе из него переменная будет уничтожена, поэтому обратиться к ней будет уже нельзя.
Крайний случай локальных переменных — это параметры. В частности, классический пример «Hello, World!»:
Здесь сразу два параметра. Первая — собственно, «Hello, World!», вторая — аргумент строки args в main.
Классификация по видимости
На основании описанного выше, можно проследить ещё одно деление – по видимости переменных. Существует 4 группы:
Несмотря на то, что приватные элементы доступны внутри класса, вопрос: «как обращаться к private java переменным?» всё же имеет ответ. Для того, чтобы иметь возможность извне поменять значение приватного параметра, достаточно внутри того же класса создать публичный метод. Например так:
Таким образом, в случае необходимости вы легко сможете изменить значение private переменной.
Указатели — ещё один вариант глобальных переменных. Вспомните, для создания экземпляра объекта мы используем следующую запись:
класс_объекта имя_указателя = new класс_объекта;
Такие переменные называются ссылочными переменными.
Блог только про Java
Учимся программировать на Java с нуля
Область видимости переменной в Java
Это означает, что в другом методе можно объявить переменную с точно таким же име-нем без какого-либо конфликта.
Давайте мы с вами создадим программу постепенно, где увидите что и как используется:
1. Создайте новую программу с именем Scope, содержащую стандартный метод main.
2. Внутри фигурных скобок главного метода объявите и проинициализируйте локальную строковую переменную, а затем выведите ее значение.
3. После главного метода перед последней фигурной скобкой класса добавьте еще один метод с именем sub.
4. Внутри фигурных скобок метода sub объявите и проинициализируйте локальную строковую переменную с тем же именем, что и переменная в главном методе.
5. Добавьте вызов метода sub в конец метода main.
6. Сохраните программу под именем Scope.java, затем скомпилируй-те и запустите. Код должен выглядеть так:
После компиляции получаем:
Аналогично, при помощи ключевого слова static может быть объявлена «переменная класса», которая доступна глобально для всего класса. Объявление этой переменной должно быть выполнено перед объявлением главного метода сразу после фигурных скобок, следующих за
объявлением класса.
В программе могут встретиться одноименные глобальная переменная класса и локальная переменная метода. Локальная переменная метода имеет приоритет до тех пор, пока глобальная переменная класса не будет вызвана при помощи точечной записи с использованием имени класса, либо не объявлена локальная переменная с тем же именем.