Как отмечалось ранее, в иерархии наследования, может быть выполнено переопределение методов суперкласса в подклассах. Напомним, что переопределенными методами называются такие методы, имеющие одинаковую сигнатуру типов (т.е. совпадает тип возвращаемого значения, имя метода, число и тип параметров). Методика переопределения является основой для одной из мощных концепций 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) // конструктор с параметрами