Область действия объектов (scope). Удаление объектов. Преимущества использования подхода «сборки мусора» (garbage collection) для объектов
Содержание
- 1. Как в Java определяется область действия переменных примитивного типа?
- 2. Можно ли во внутренней области действия «замещать» имя переменной примитивного типа, которая объявлена во внешней области действия?
- 3. Можно ли давать одинаковые имена переменным, которые объявлены в разных областях действия?
- 4. Как определяется область действия для объектов? Какое отличие между областью действия примитивных типов и областью действия объектов?
- 5. Какие преимущества дает подход «сборки мусора» по сравнению с традиционными подходами, которые были реализованы в языках C/C++?
- Связанные темы
Поиск на других ресурсах:
1. Как в Java определяется область действия переменных примитивного типа?
В языке программирования Java область действия (scope) переменных или объектов определяется положением фигурных скобок { }. Переменная, которая объявлена в пределах области действия, есть доступной только в этой области действия.
Например.
{ double x; // доступна x x = 3.86; { double y; // доступны x, y x = 5.55; y = 7.393; { double z = 3.88; // доступны x, y, z x = 2.88; y = 33.22; z = 11.33; } // здесь z недоступно //z = 29.99; // ошибка } // здесь y - недоступно //y = 1000.05; // ошибка x = 13.23; // x - доступно, правильно }
⇑
2. Можно ли во внутренней области действия «замещать» имя переменной примитивного типа, которая объявлена во внешней области действия?
В языке Java не допускается «замещать» имя переменной, которая объявлена во внешней области действия.
Например. В нижеследующем коде возникнет ошибка компиляции.
{ double x = 2.88; // правильно { double x; // ошибка "Duplicate local variable x" } }
В языках C/C++ подобный код не вызовет ошибки.
⇑
3. Можно ли давать одинаковые имена переменным, которые объявлены в разных областях действия?
Да.
Например. В нижеследующем коде объявляются переменные с одинаковыми именами, но которые размещаются в разных областях действия. Такой код работает.
{ { double x = 2.88; // правильно System.out.println("x = " + x); } { double x; // и так можно x = 3.55; System.out.println("x = " + x); } System.out.println("OK!"); }
Результат работы программы:
x = 2.88 x = 3.55 OK!
⇑
4. Как определяется область действия для объектов? Какое отличие между областью действия примитивных типов и областью действия объектов?
При объявлении ссылки на объект, сама переменная-ссылка имеет область действия в пределах фигурных скобок { }. Если для объекта память была выделена оператором new, тогда сам объект будет существовать и после того, как исчезнет переменная-ссылка на него.
Например. Пусть задан класс CPoint.
class CPoint { private int x, y; public CPoint(int nx, int ny) { x = nx; y = ny; } public int GetX() { return x; } public int GetY() { return y; } }
В нижеследующем фрагменте кода объявляется ссылка на объект класса CPoint для которого память выделяется оператором new.
{ // ... { CPoint pt1 = new CPoint(5, 6); // pt1 ссылается на экземпляр объекта, в котором x=5, y=6 int d = pt1.Get(); // d = 5 } // исчезают переменные pt1, d; а объект типа CPoint остается // здесь объект, который был создан в области действия { } еще пока что остается в памяти // если на него не будет ссылок, то он будет удален "уборщиком мусора" (garbage collector) // ... }
Переменная-ссылка pt1 исчезает после фигурной закрывающей скобки }. Однако, объект, на который указывала переменная-ссылка, остается в памяти. Если на него не будет больше ссылок, то он будет удален «уборщиком мусора» (garbage collector).
В вышеприведенном фрагменте кода невозможно получить доступ к объекту после уничтожения переменной pt1. Поскольку, эта единственная ссылка на объект вышла за пределы видимости. Если нужно сохранить доступ к объекту, то в Java существуют способы копирования ссылок на объекты. Но это уже совсем другая тема.
⇑
5. Какие преимущества дает подход «сборки мусора» по сравнению с традиционными подходами, которые были реализованы в языках C/C++?
Подход, который используется в Java, дает несколько преимуществ сравнительно с языками программирования C/C++. В языках программирования C/C++ нужно вручную удалять память для ненужных объектов, созданных оператором new. Если этого не сделать, то возникнет «утечка памяти» или memory leak. В языке программирования Java не нужно следить за удалением выделенной памяти, это все сделает «уборщик мусора» (garbage collector). Это, в свою очередь, упрощает программирование и уменьшает риск ошибок.
«Сборщик мусора» просматривает объекты и определяет те, на которые уже не существует ссылок. После этого он удаляет память, выделенную для этих объектов.
⇑
Связанные темы
- Применение классов в программах на Java. Определение класса и объекта класса. Примеры
- Создание и сохранение объектов классов. Оператор new. Области сохранения данных в памяти. Использование массивов ссылок на объекты