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

Переопределение методов

Способность Java делать выбор метода, исходя из типа времени выполнения, называется динамическим полиморфизмом. Поиск метода происходит сначала в данном классе, затем в суперклассе, пока метод не будет найден или не  достигнут Object– суперкласс для всех классов.

Оператор instanceof действует в этой ситуации аналогичным образом. Результатом действия будет истина, если объект является объектом одного из подклассов класса, на принадлежность к которому проверяется данный объект, но не наоборот. Проверка на принадлежность объекта к классуObjectвсегда даст истину как результат. Результат применения этого оператора по отношению кnullвсегда ложь, потому чтоnullнельзя причислить к какому-либо типу. В тоже время литералnullможно передавать в методы по ссылке на любой объектный тип и использовать в качестве возвращаемого значения.

Отметим, что статические методы могут быть переопределены в подклассе, но не могут быть полиморфными, так как их вызов не затрагивает объекты.

Полное имя метода включает его имя, возвращаемое значение и параметры. Если два метода с одинаковыми именами находятся в одном классе, списки параметров должны отличаться. Такие методы являются перегружаемыми (overload). Если метод подкласса совпадает с методом суперкласса (порождающего класса), то метод подкласса переопределяет (overriden) метод суперкласса. Все методыJavaявляются виртуальными (ключевое слово virtual как вC++ не используется). Переопределение методов является основой концепции динамического связывания, реализующей полиморфизм. Когда переопределенный метод вызывается через ссылку суперкласса, Java определяет, какую версию метода вызвать, основываясь на типе объекта, на который имеется ссылка. Таким образом, тип объекта определяет версию метода на этапе выполнения. В следующем примере рассматривается реализация полиморфизма на основе динамического связывания. Так как суперкласс содержит методы, переопределенные подклассами, то объект суперкласса будет вызывать методы различных подклассов, в зависимости от того, на объект какого подкласса у него имеется ссылка.

Перегрузка методов

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

При вызове перегруженных методов следует избегать ситуаций, когда компилятор будет не в состоянии выбрать тот или иной метод, как, например, в случае:

// пример # 5 : вызов перегруженного метода: DemoCD.java

classClassC {}

class ClassD extends ClassC{}

public class DemoCD {

static void show(ClassC obj1, ClassD obj2){

System.out.println("первый метод show(ClassC, ClassD)");

     }

static void show(ClassD obj1, ClassC obj2){

System.out.println("второй метод show(ClassD, ClassC)");

}

static void show(Object obj1, Object obj2){

System.out.println("третий метод show(Object, Object)");

}

public static void main(String[] args) {

     ClassC c = new ClassC();

     ClassD d = new ClassD();

     Object ob= new Object();

     show(c,d);//1_первый метод

     show(d,c);//2_второй метод

     show(c,c);//3_третий метод

     //show(d,d);// 4_ошибка компиляции

     show(ob, ob);//5_третий метод

     show(c,ob);//6_третий метод

     show(ob,d);//7_третий метод

}

}

В первом, втором и пятом случаях передаваемые параметры в метод show()полностью совпадают с параметрами при объявлении метода. В третьем случае первый и второй методы не годятся для использования, так как одним из параметров этих методов является объект классаClassD, а определение вызываемого метода идет вверх по цепочке наследования для параметров, поэтому в данном случае будет вызван метод с параметрами типаObject. Аналогичная ситуация возникает в шестом и седьмом случаях. В четвертом случае оба первых методаshow()одинаково подходят для вызова  (также как и третий), поэтому возникнет ошибка компиляции. Чтобы избежать неопределенности, следует использовать явное преобразование типов, например:

show(d,(ClassC)d);

show(d,(Object)d);

Каждый из вариантов вызовет в итоге соответствующий ему метод show().

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