Выбрать главу

использовать,  а  вот  обратиться  напрямую  к  полям  вне  класса  не

получится. Например, в главном методе программы создается объ-

ект fellow класса Person. И хотя у объекта fellow есть поля name и  age,  использовать  инструкцию  вида  fellow.name  или  fellow.age не получится.

С методом show() все просто — он нужен для отображения значений по-

лей name и age объекта, из которого вызывается метод. Нас интересует

метод set(). С помощью метода задаются значения полей name и age. Мы

перегружаем метод для того, чтобы можно было по-разному задавать

значения полей объекта. Естественным представляется вариант, когда

мы указываем в качестве аргументов метода set() значения, которые

присваиваются полям объекта. В этом случае первый, числовой, аргу-

мент определяет значение поля age, а второй, текстовый, аргумент задает

значение поля name.

Перегрузка методов           63

Если метод set() вызывается без аргументов, поле age получит нулевое зна-

чение, а значением поля name будет текст "Нет имени". Кроме этого, можно

передать только один аргумент методу set(). Если это числовой аргумент, то соответствующее значение получает поле age. Поле name, которое обде-

лено вниманием при передаче аргументов методу set(), получит значение

"Нет имени". В случае, когда единственный аргумент метода set() тексто-

вый, это текстовое значение будет присвоено полю name объекта. Числовое

поле age получит нулевое значение.

Версии метода set() с двумя аргументами и без аргументов описы-

ваются в явном виде. А вот при описании двух версий метода set() с одним аргументом мы схитрили — в теле перегружаемого метода

вызывали версию метода с двумя аргументами. Вообще же следует

понимать, что на самом деле разные версии перегруженного мето-

да — это разные методы. Просто эти методы имеют совпадающие

имена.

В главном методе программы в классе PersonDemo проверяются различные

способы присваивания значений полям объекта fellow класса Parson. Для

присваивания значений полям объекта мы вызываем из объекта метод

set() с разными наборами аргументов. Проверка значений полей объекта

осуществляется командой fellow.show(). Результат выполнения програм-

мы представлен на рис. 2.2.

Рис. 2.2.  Результат выполнения программы с перегруженным методом

ПРИМЕЧАНИЕ Имеет смысл акцентировать внимание еще на одном немаловаж ном

обстоятельстве, которое касается закрытых полей name и age. Как

отмечалось выше, эти поля закрытые и доступа к ним вне объекта

нет. Вместе с тем поля вполне функциональны и доступны к исполь-

зованию. Для доступа к закрытым полям мы используем открытые

методы: у нас есть доступ к открытым методам, а открытые методы

имеют доступ к закрытым полям. На практике это очень удобно.

64

Глава 2. Классы и объекты

Конструкторы и деструкторы

Нам песня строить и жить помогает.

Из к/ф «Веселые ребята»

Сейчас самое время познакомиться с конструкторами и их антиподами

в мире программирования — деструкторами. Здесь нет ничего сложного.

Конструктор — это специальный метод, который вызывается автоматиче-

ски при создании объекта класса. Таким образом, если мы хотим, чтобы

при создании объекта происходило нечто особенное, создаем конструктор.

Деструктор — это метод, который вызывается автоматически при удале-

нии объекта из памяти. По сравнению с конструкторами, деструкторы ис-

пользуются не так часто, но не менее эффектно.

Конструктор описывается практически так же, как обычный метод, но име-

ет некоторые особенности:

 Имя конструктора совпадает с именем класса.

 Конструктор объявляется с атрибутом public (конструктор должен быть

открытым методом).

 Конструктор не возвращает результат, а идентификатор типа результата

для него не указывается.

 У конструктора могут быть аргументы и конструкторы можно перегру-

жать (у класса может быть несколько конструкторов).

Относительно деструктора правила еще более жесткие:

 Имя деструктора — это тильда (символ ~) плюс имя класса.

 При объявлении деструктора нет необходимости использовать атрибут

public. Деструктор не возвращает результат, а идентификатор типа ре-

зультата для деструктора не указывается.