Основы объектно-ориентированного программирования. Стесик О.Л. - 9 стр.

UptoLike

Составители: 

16
блок инструкций, имя которого обязательно совпадает с именем клас-
са. Оператор new обращается именно к этому блоку, в данном случае,
с пустым списком параметров. Но в классе Hello – смотрим внима-
тельно в листинг 2.2.1 – такого блока нет! Конструкторобязатель-
ный элемент любого класса, классов без конструктора просто не мо-
жет быть, так как к
классу, не описавшему ни одного конструктора,
компилятор автоматически добавляет конструктор с пустым набором
инструкций и пустым списком параметров. Это так называемый кон-
структор по умолчанию. Так что в действительности текст класса
Hello, дополненный компилятором, выглядит так (см. листинг 2.4.1):
Листинг 2.4.1
class Hello{
String greeting=”Hello”;
String person=”world”;
//Конструктор по умолчанию, добавленный компиля-
тором
Hello(){}
void sayHello(){
System.out.println(greeting+”, ”+person+”!”);
}
}
Создание экземпляра оператором new может выполняться в от-
дельной инструкции:
new Hello();
Эта операция приведет в действие конструктор класса и в результа-
те в оперативной памяти компьютера возникнет копия класса, недос-
тупная извне. (Иногда ничего больше и не требуется.) Чтобы получить
доступ к элементам экземпляра
необходимо выполнить связывание
экземпляра с переменной совместимого типа. Все переменные, тип
которых определен каким-либо классом, называются ссылочными пе-
ременными. Связывание выполняется посредством «присваивания»
переменной результата работы оператора new. Тип переменной дол-
жен совпадать с классом экземпляра (классэто описание типа дан-
17
ных) или быть совместим с ним (речь о совместимости типов пойдет в
уроке 9). То есть, строку
Hello h=new Hello();
нужно интерпретировать как две отдельных инструкцииописание
переменной h типа Hello:
Hello h;
и инструкцию связывания переменной h с новым экземпляром
класса Hello:
h=new Hello();
Экземпляр доступен, пока хотя бы одна переменная сохраняет связь
с ним. После того как экземпляр был
связан с одной переменной, мож-
но связать его с любым числом переменных подходящего типа. Доста-
точно описать такую переменную и «присвоить» ей «значение» пере-
менной, уже связанной с экземпляром.
Hello z;
z=h;
После чего экземпляр становится доступен и по ссылке h, и по
ссылке z. Слова «присвоить» и «значение» взяты в кавычки, так как ни
то и ни другое не имеет смысла для ссылки. Их следует понимать как
«перевести ссылку z в состояние ссылки h». Тогда понятно, что объек-
ты не копируются при связывании с новой ссылкой. Со всеми выте-
кающими отсюда последствиями: изменения объекта по одной ссылке
на него неизбежно отразятся по другой.
Пример, приведенный в
листинге 2.4.2, наглядно это подтверждает
: Листинг 2.4.2
class HelloDemoB{
public static void main(String[] args){
//Первая ссылка:
Hello h=new Hello();
//Опишем вторую ссылку-переменную типа Hello:
Hello z;
//Переведем ее в состоянии ссылки h:
z=h;
//Изменим значения переменных экземпляра: