Объект класса-потомка можно присвоить переменной типа класса-предка. При этом Java производит автоматическое преобразование типа, называемое расширением. Расширение — это переход от более конкретного типа к менее конкретному. Переход от byte к int — это тоже расширение.
Рассмотрим пример, имеющий отношение к основному заданию. В программе есть класс User
, предназначенный для обработки информации о пользователях системы. В этом классе есть метод enter(String login, String password)
, который возвращает true, если переданные в метод логин и пароль совпадают с логином и паролем, скрытым в полях класса.
Мы наследуем от класса User
два подкласса: Admin
и, к примеру, Member
(для программы координации участников встречи, см. задание 13). Класс Admin
может понадобиться нам впоследствии для каких-то специфичных действий, связанных с управлением системой, а класс Member
моделирует участников проекта, которые с помощью программы пытаются выбрать оптимальное место для встречи. Открытый метод addRequest(String place, int day, int from, int to)
вызывается, когда участник проекта предлагает новый вариант времени и места встречи.
В главном классе программы мы храним массив* users
, содержащий всех пользователей системы. Элементы этого массива имеют тип User
, но мы можем присваивать им ссылки на объекты как класса Member
, так и класса Admin
. В этот момент и будет происходить расширение типа.
Member member = new Member(...);
users[3] = member; // Java проводит автоматическое преобразование типа Member к типу User, чтобы поместить переменную member в массив users
Для того, чтобы найти пользователя с введенными логином и паролем программа выполняет запрос:
for (int i = 0; i < users.length; i++)