Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unix.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.91 Mб
Скачать

8.5. Наследование, переопределение методов

Мощной возможностью Java, как и любого объектно-ориентированного языка, является наследование. При наследовании, порожденный класс получает свойства и методы того класса, от которого он был порожден, и их не надо переписывать заново. Кроме того, он может дополнительно определить свои собственные свойства и методы, а также переопределить унаследованные методы (т. е. реализовать те же методы, но по своему). Наследование задается при помощи ключевого слова extends в описании класса (синтаксис см. раньше). Переопределение унаследованных методов реализуется путем описания в порожденном классе метода с таким же именем, что и унаследованный метод. После того, как метод переопределен, доступ к первоначальному варианту возможен с использованием специальной переменной super ( доступ: super. метод_родителя или super.свойство_родителя ), которая указывает на класс, от которого был порожден данный. Ниже приведен пример, в котором от класса avtomobil порождается класс mercedes, в котором переопределен метод poehal и создан новый метод marka. Причем метод poehal переопределен так, что сначала вызывается старый вариант метода (super.poehal ( ) ), а затем добавляются новые команды. Кроме того, предусмотрена возможность перегрузки метода, т. е. вызова одного и того же метода, с различными вариантами параметров. Пример:

class avtomobil {

long probeg; // Задаем свойство "пробег"

void poehal ( ) { System.out.println (" Еду "); } // Задаем метод "поехал" }

class mercedes extends avtomobil { // Объект mercedes порожден от avtomobil

/* Свойство probeg определять не надо, т.к. оно унаследовано. Метод poehal также не надо было бы определять, но мы хотим заменить реализацию этого метод на свою, т.е. переопределить метод. Кроме того, мы создаем возможность перегружать метод poehal, описывая различные реализации этого метода для различных наборов параметров */

void poehal ( ) { super.poehal( ); System.out.println (" Еду быстро ..."); } void poehal ( String kuda ) { super.poehal( ); System.out.println (" Еду "+kuda); } void marka ( ) { System.out.println (" Шестисотый мерс!"); } //Задаем новый метод marka }

public class proga {

public proga( ) {

mercedes myCar = new mercedes ( );

myCar.marka ( ); myCar.poehal( ); myCar.poehal( " в клуб"); }

public static void main(String args[ ] ) { proga go = new proga (); } }

8.6. Создание иерархии объектов.

Вышестоящий объект

Подчиненный объект

Необходимо отличать наследование, от создания иерархии объектов. При наследовании, порожденный класс получает набор свойств и методов от класса, от которого происходит наследование. Таким образом, эти два класса имеют много общего. При создании иерархии объектов, вышестоящий и подчиненный объекты могут не иметь ничего общего, но один объект подчи­няется другому, т. е. доступ к свойствам и методам подчиненного объекта

возможен через свойство вышестоящего объекта. Проводя аналогию с жизнью: сын похож на отца, но начальник и подчиненный не обязательно из одной семьи. Хочется также подчеркнуть уже прозвучавшую разницу: наследование - для классов, иерархия - для объектов, т.е. для экземпляров класса. Иерархия задается путем описания в классе вышестоящего объекта свойства, создающего подчиненный объект, в классе которого может быть также описано свойство, создающее объект еще более низкого уровня иерархии и т. д. Тогда, создав вышестоящий объект, вы автоматически создаете дерево подчиненных объектов. В примере ниже, описан объект mercedes, который содержит подчиненный объект koleso (свойство osi),

который, в свою очередь, содержит подчиненный объект болт (свойство zaklepki). При создании автомобиля автоматически создаются колеса и болты. Доступ к подчиненным объектам происходит в формате: вышестоящий_объект . подчиненный_объект . свойства_подчиненного_объекта.

package primer; class avtomobil { long probeg = 3;

void poehal ( ) { System.out.println (" Еду "); }

}

class mercedes extends avtomobil { // Наследование от класса avtomobil

void poehal ( ) { System.out.println (" Еду быстро "); } void marka ( ) { System.out.println (" Шестисотый мерс!"); }

koleso osi = new koleso (); // Создание подчиненного объекта

}

class koleso {

boolean zapaska=false; // Описание обычного свойства "запаска"

bolt zaklepki = new bolt(); // Создание подчиненного объекта }

class bolt { int nomerbolta = 100; }

public class proga {

mercedes myCar; // Описание переменной myCar

public proga() {

myCar = new mercedes ( ); // Создание вышестоящего объекта myCar.marka ( ); // Использование метода вышестоящего объекта

myCar.osi.zapaska = true; // Использование свойства объекта второго уровня иерархии myCar.osi.zaklepki.nomerbolta = 1; // Использование свойства объекта третьего уровня иерархии }

public static void main(String args[ ] ) { // Запуск программы

proga go = new proga ();}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]