Ссылка на элемент суперкласса — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Ссылка на элемент суперкласса

2019-08-04 224
Ссылка на элемент суперкласса 0.00 из 5.00 0 оценок
Заказать работу

При наследовании могут складываться достаточно неоднозначные ситуации. Один из примеров такой ситуации — совпадение названия наследуемого подклассом поля с названием поля, описанного непосредственно в подклассе. С формальной точки зрения подобная ситуация выглядит так, как если бы у подкласса было два поля с одним и тем же именем: одно поле собственно подкласса и одно, полученное «по наследству». Технически так оно и есть. В этом случае естественным образом возникает вопрос о способе обращения к таким полям. По умолчанию если обращение выполняется в обычном формате, через указание имени поля, то используется то из двух полей, которое описано непосредственно в подклассе.

Рассмотрим пример, представленный в листинге 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.019 с.