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

Конструкторы при наследовании

В рассмотренных выше примерах мы видели использование конструкторов в суперклассе и подклассе. В данной иерархии может быть только один основной суперкласс и сколько угодно производных от него подклассов, каждый из которых может являться суперклассом для производных от него. Как же при этом вызываются и выполняются конструкторы классов при такой иерархии? Если в конструкторе подкласса есть оператор super (он всегда первый), то перед выполнением конструктора подкласса управление передается соответствующему конструктору суперкласса. Если super отсутствует, то это не влияет на порядок выполнения конструкторов. При этом из конструктора подкласса будет вызван конструктор без параметров суперкласса. Этот порядок вызова конструкторов логичен, так как при создании объекта подкласса суперкласс (его конструктор) ничего не знает о своем подклассе. И логично выполнить создание его подобъекта и инициализацию вначале. А далее только достраивать объект.

Динамическая диспетчеризация методов

Как отмечалось ранее, в иерархии наследования, может быть выполнено переопределение методов суперкласса в подклассах. Напомним, что переопределенными методами называются такие методы, имеющие одинаковую сигнатуру типов (т.е. совпадает тип возвращаемого значения, имя метода, число и тип параметров). Методика переопределения является основой для одной из мощных концепций Java – динамической диспетчеризации методов. Динамическая диспетчеризация это механизм, на основании которого принимается решение на вызов того или иного переопределенного метода во время выполнения, а не компиляции. Динамическая диспетчеризация является одной из сторон реализации принципа полиморфизма в Java.

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

class A // суперкласс А

{ protected int a;

A() { } // конструктор без параметров

A(int aa) // конструктор c параметрами

{ a = aa; } // создание нового объекта

void show()

{ System.out.println("supperclass a = " + a); }

}

class B extends A // подкласс В

{ protected int b;

B() { } // конструктор без параметров

B(int aa, int bb) // конструктор с параметрами

{ super(aa);

b = bb;

}

void show()

{ System.out.println("subclass b= " + b); }

}

class C extends B // подкласс C

{

private int c;

C() { } // конструктор без параметров

C(int aa, int bb, int cc) // конструктор с параметрами

{ super(aa,bb);

c = cc;

}

void show()

{ System.out.println("subclass c= " + c); }

}

class start

{ public static void main(String[] args

{ A ob1 = new A(1);

B ob2 = new B(2,3);

C ob3 = new C(4,5,6);

A ob;

ob=ob1;

ob.show();

ob=ob2;

ob.show();

ob=ob3;

ob.show();

}

}

Результат выполнения программы:

supperclass a = 1

subclass b= 3

subclass c= 6