Составители:
Рубрика:
18
h.greeting=”Здорово”;
h.person=”мужики”;
//Вызовем метод sayHello() через вторую ссылку:
z.sayHello();
}
}
В результате исполнения получим:
Листинг 2.4.3
java HelloDemoB
Здорово, мужики!
Что и следовало ожидать.
Переменная, связанная с объектом, является по сути именованным
указателем на занимаемую этим объектом область памяти, которая
доступна, пока существует хотя бы один такой указатель. Разорвать
связь переменной с экземпляром можно, переведя ее в состояние null:
Hello h=new Hello();
h = null;
«Значение» null, «присвоенное» переменной ссылочного типа, ос-
вобождает
ее от связи с каким-либо объектом.
2.5 Неожиданная потеря объекта
Ссылочная переменная в процессе написания программы может
оказаться в одном из трех состояний: указывать на объект, не указы-
вать никуда – null, и быть в состоянии неопределенности. Состояние
неопределенности контролируется компилятором – он не допустит
операций с переменной в состоянии неопределенности. Если же пере-
менная имеет значение null, компилятор не сочтет операции с ней
ошибочными
. Отсутствие у переменной в состоянии null связи с объ-
ектом обнаружится только во время выполнения программы. Попытка
обратиться к ссылке в состоянии null в Java трактуется как исключи-
тельная ситуация (авария, ошибка алгоритма программы).
Речь об обработке исключений еще впереди (урок 11), но начи-
нающему Java-программисту вряд ли удастся избежать попадания в
19
самую «популярную» «аварию». Смоделируем эту ошибку намеренно
и подготовимся таким образом к случайным потерям объекта. После
последней строки метода main класса HelloDemoB из листинга 2.4.2
добавим две инструкции
h=null;
h.sayHello();
То есть, явно переведем переменную в состояние null, а потом,
«забыв» об этом, попытаемся обратиться к объекту, который уже не-
доступен по этому имени. В
листинге 2.5.1 приведен полный текст
класса HelloDemoB добавленными строками.
: Листинг 2.5.1
class HelloDemoB{
public static void main(String[] args){
//Первая ссылка:
Hello h=new Hello();
//Опишем вторую ссылку-переменную типа Hello:
Hello z;
//Переведем ссылку z в состоянии ссылки h:
z=h;
//Изменим значения переменных экземпляра:
h.greeting=”Здорово”;
h.person=”мужики”;
//Вызовем метод sayHello() через вторую ссылку:
z.sayHello();
//Переведем ссылку h в состояние null:
h = null;
//Попытаемся обратиться к объекту через ссылку
h:
h.sayHello();
}
}
Компиляция пройдет успешно, а в результате исполнения получим:
Листинг 2.5.2
java HelloDemoB
Страницы
- « первая
- ‹ предыдущая
- …
- 8
- 9
- 10
- 11
- 12
- …
- следующая ›
- последняя »