Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Топ:
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Интересное:
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Дисциплины:
2019-08-04 | 224 |
5.00
из
|
Заказать работу |
|
|
При наследовании могут складываться достаточно неоднозначные ситуации. Один из примеров такой ситуации — совпадение названия наследуемого подклассом поля с названием поля, описанного непосредственно в подклассе. С формальной точки зрения подобная ситуация выглядит так, как если бы у подкласса было два поля с одним и тем же именем: одно поле собственно подкласса и одно, полученное «по наследству». Технически так оно и есть. В этом случае естественным образом возникает вопрос о способе обращения к таким полям. По умолчанию если обращение выполняется в обычном формате, через указание имени поля, то используется то из двух полей, которое описано непосредственно в подклассе.
Рассмотрим пример, представленный в листинге 4.
Листинг 4. Дублирование полей при наследовании
// Суперкласс:
class MyClassA{
// Поле:
int number;
// Конструктор суперкласса:
MyClassA(){
number=0;
System.out.println("Создан объект суперкласса с полем "+number);}
// Отображение значения поля:
void showA(){
System.out.println("Поле number: "+number);}
}
// Подкласс:
class MyClassB extends MyClassA{
// Поле с тем же именем:
int number;
// Конструктор подкласса:
MyClassB(){
super(); // Вызов конструктора суперкласса
number=100;
System.out.println("Создан объект подкласса с полем "+number);}
// Отображение значения поля:
void showB(){
System.out.println("Поле number: "+number);}
}
class TwoFieldsDemo{
public static void main(String[] args){
// Создание объекта подкласса:
MyClassB obj=new MyClassB();
// Изменение значения поля:
obj.number=50;
// Отображение значения поля:
obj.showA();
obj.showB();
}}
Результат выполнения программы имеет вид:
Создан объект суперкласса с полем 0
Создан объект подкласса с полем 100
Поле number: 0
Поле number: 50
В классе MyClassA объявлены числовое поле number, метод showA() для отображения значения этого поля и конструктор без аргументов, которым присваивается нулевое значение полю number и выводится сообщение о создании объекта суперкласса с указанием значения поля.
|
Подкласс MyClassB, создаваемый на основе суперкласса MyClassA, также содержит описание числового поля number. Описанный в классе метод showB() выводит на экран значение поля number, а конструктор без аргументов позволяет создать объект подкласса с полем number, инициализированным по умолчанию значением 100. Таким образом, в программном коде класса MyClassB складывается довольно интересная ситуация: класс имеет два поля number. Объявленное непосредственно в классе поле «перекрывает» наследуемое поле с таким же именем, поэтому как в методе showB(), так и в конструкторе подкласса инструкция number является обращением именно к полю, описанному в классе.
В главном методе main() в классе TwoFieldsDemo создается объект obj подкласса MyClassB. Результатом выполнения команды new MyClassB() являются сообщения:
Создан объект суперкласса с полем 0
Создан объект подкласса с полем 100
Первое сообщение появляется в результате вызова конструктора суперкласса в рамках вызова конструктора подкласса. Конструктор суперкласса «своему» полю number присваивает значение 0 и выводит сообщение о создании объекта суперкласса. Затем выполняются команды из тела конструктора подкласса.
В результате другому полю number (описанному в подклассе) присваивается значение 100 и выводится сообщение о создании объекта подкласса. Таким образом, при создании поля number объекта obj получают значения 0 и 100.
В главном методе при обращении к полю number командой obj.number=50 изменяется значение того поля, которое описано в подклассе. Другими словами, поле number, имевшее значение 100, получает значение 50.
При выводе значения поля number командой obj.showA() выполняется обращение к полю, описанному в суперклассе: метод showA() обращается в своем программном коде к полю по имени и для него это то поле, которое описано в суперклассе — там же, где описан соответствующий метод. Командой obj.showB() выводится значение поля number, описанного в подклассе.
|
Чтобы различать одноименные поля, описанные и унаследованные, указывают инструкцию super, то есть ту же самую инструкцию, что и при вызове конструктора суперкласса. Только в этом случае синтаксис ее использования несколько иной.
Обращение к полю, наследованному из суперкласса (описанному в суперклассе), выполняется в формате super.имя_поля. Например, чтобы в методе showB() из рассмотренного примера обратиться к полю number суперкласса, достаточно воспользоваться инструкцией super.number. В листинге 5 приведен измененный код предыдущего примера, в котором в подклассе выполняется обращение как к унаследованному, так и описанному непосредственно в подклассе полю number.
Листинг 5. Обращение к дублированным полям
// Суперкласс:
class MyClassA{
// Поле:
int number;
// Конструктор суперкласса:
MyClassA(int a){
number=a;
System.out.println("Создан объект суперкласса с полем "+number);}
// Отображение значения поля:
void showA(){
System.out.println("Поле number: "+number);}
}
// Подкласс:
class MyClassB extends MyClassA{
// Поле с тем же именем:
int number;
// Конструктор подкласса:
MyClassB(int a){
super(a-1); // Вызов конструктора суперкласса
number=a; // Поле из подкласса
// Обращение к полю из суперкласса и подкласса:
System.out.println("Создан объект с полями: "+super.number+" и "+number);}
// Отображение значения поля:
void showB(){
// Обращение к полю из суперкласса и подкласса:
System.out.println("Поля объекта "+super.number+" и "+number);}
}
class TwoFieldsDemo2{
public static void main(String[] args){
// Создание объекта подкласса:
MyClassB obj=new MyClassB(5);
// Изменение значения поля:
obj.number=10;
// Отображение значений полей:
obj.showA();
obj.showB();
}}
В отличие от предыдущего случая, конструктору суперкласса передается аргумент, который присваивается в качестве значения полю number. Как и ранее, значение поля отображается с помощью метода суперкласса showA().
Конструктор подкласса также имеет аргумент. Значение аргумента присваивается полю number, определенному непосредственно в классе. Одноименное наследуемое поле получает значение, на единицу меньшее аргумента конструктора.
Для этого вызывается конструктор суперкласса с соответствующим аргументом. При выполнении конструктора подкласса также выводится сообщение о значении двух полей, причем обращение к полю, определенному в подклассе, выполняется по имени number, а обращение к полю, определенному в суперклассе, через инструкцию super.number. Значения обоих полей можно вывести на экран с помощью метода showB().
|
Главный метод программы содержит команду создания объекта подкласса, команду изменения значения поля number, определенного в подклассе (инструкцией obj.number=10), а также команды вывода значений полей с помощью методов showA() и showB(). В результате выполнения этой программы получаем следующее:
Создан объект суперкласса с полем 4
Создан объект с полями: 4 и 5
Поле number: 4
Поля объекта 4 и 10
По тому же принципу, что и замещение полей с совпадающими именами, замещаются и методы с одинаковыми сигнатурами. Однако с методами ситуация обстоит несколько сложнее, поскольку существует такой механизм, как перегрузка методов. Кроме перегрузки важным понятием является переопределение методов.
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!