использовать, а вот обратиться напрямую к полям вне класса не
получится. Например, в главном методе программы создается объ-
ект 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. Деструктор не возвращает результат, а идентификатор типа ре-
зультата для деструктора не указывается.