Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 конспект лекций ООП Java.doc
Скачиваний:
28
Добавлен:
03.05.2015
Размер:
962.05 Кб
Скачать

2. Библиотека стандартаJava_se Наследование

Один класс (подкласс) может наследовать переменные и методы другого класса (суперкласса), используя ключевое слово extends. Подкласс имеет доступ ко всем открытым переменным и методам родительского класса, как будто они находятся в подклассе. В то же время подкласс может иметь методы с тем же именем и сигнатурой, что и методы суперкласса. В этом случае подкласс переопределяет методы родительского класса. В следующем примере переопределяемый метод show() находится в двух классах Bird и Eagle. По принципу полиморфизма вызывается метод, наиболее близкий к текущему объекту.

/* пример # 1 : наследование класса и переопределение метода : BirdSample.java */

classBird {

private float price;

privateString name;

public Bird(float p, String str) { //конструктор

price = p;

name = str;

}

public float getPrice(){

returnprice;

}

public String getName(){

returnname;

}

voidshow(){

    System.out.println("название: " +name+ ", цена: "+price);

}

}

class Eagle extends Bird {

    private boolean fly;

public Eagle(float p, String str, boolean f) {

 super(p,str); //вызов конструктора суперкласса

 fly=f;

}

voidshow(){

System.out.println("название:" +getName() + ", цена: " +

getPrice() + ", полет:" + fly);

   }

}

public class BirdSample {

        public static void main(String[] args) {  

Bird b1 = new Bird(0.85F, "Гусь");

     Bird b2 = new Eagle(10.55F, "Белый Орел", true);

     b1.show(); // вызов show() класса Bird

     b2.show(); // вызов show() класса Eagle

  }

}

Объект b1 создается при помощи вызова конструктора класса Bird, и, соответственно, при вызове метода show(), вызывается версия метода из класса Bird. При создании объекта b2 ссылка типа Bird инициализируется объектом типа Eagle. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.

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

Использование super и this

Ключевое слово superиспользуется для вызова конструктора суперкласса и для доступа к члену суперкласса. Например:

super(список_параметров); /* вызов конструктора суперкласса с передачей параметров */

super.i = n; /* присваивание значения атрибуту суперкласса */

super.method(); // вызов метода суперкласса

Вторая форма superподобна ссылкеthisна экземпляр класса. Третья форма специфична дляJavaи обеспечивает вызов переопределенного метода, причем если в суперклассе этот метод не определен, то будет осуществляться поиск по цепочке наследования до тех пор, пока метод не будет найден. Каждый экземпляр класса имеет неявную ссылкуthisна себя, которая передается также и методам. После этого можно писатьthis.price хотя и необязательно.

Следующий код показывает, как, используя this, можно строить одни конструкторы на основе других.

// пример # 3 : this в конструкторе : Locate3D.java

classLocate3D {

  private int x, y, z;

 public Locate3D(int x, int y, int z) {

   this.x = x;

   this.y = y;

   this.z = z;

}

 public Locate3D() {

this(-1, -1, -1);

}

}

В этом классе второй конструктор для завершения инициализации объекта обращается к первому конструктору. Такая конструкция применяется в случае, когда в классе имеется несколько конструкторов и требуется добавить конструктор по умолчанию.

Ссылка this используется в методе для  уточнения того, о каких именно  переменныхxиyидет речь в каждом отдельном случае, а конкретно для доступа к переменной класса, если в методе есть локальная переменная с тем же именем. Инструкцияthisдолжна быть единственной в вызывающем конструкторе и быть первой по счету выполняемой операцией.

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