Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ МИР.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
546.82 Кб
Скачать

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

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

Box box1 = new Box();

SubBox box2 = new SubBox();

box1 = box2; // нет ошибки

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

Пример: Имеется суперкласс Box с методом volume() и его подкласс WeightBox с методом weight().

WeightBox box1 = new WeightBox();

Box box2 = new Box();

box1.volume();

box2 = box1;

box2.volume();

box2.weight(); // ошибка: метод недоступен

Последний метод в данном случае недоступен.

Перекрытие методов лежит в основе одного из принципов языка Java – динамической диспетчеризации методов. Это механизм, посредством которого, вызов перекрытого метода осуществляется во время выполнения программы, а не на этапе компиляции. Динамическая диспетчеризация методов является способом обеспечения полиморфизма в Java. Определяющим параметром при выборе перекрытого метода является тип объекта, на который ссылается ссылка, а не тип самой ссылки. Если в суперклассе определен метод, перекрытый впоследствии в подклассе, то при ссылке переменной на объекты различных типов, выполняются различные версии этого метода.

41 Абстрактные классы в Java.

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

Иногда возникает ситуация, когда метод более предпочтительно реализовать в классе потомке. Например, класс «Фигура» может иметь метод «рисовать», Известно, что фигуру можно рисовать, но неизвестно каким образом. Метод «рисовать» получает конкретную реализацию уже в потомках класса «Фигура» (например в классе «Линия»).

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

Используется следующая форма объявления таких методов:

abstract тип имя (параметры);

Любой класс, содержащий один или несколько абстрактных методов также является абстрактным. (перед словом class пишется abstract).

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

Несмотря на то, что нельзя создавать объекты абстрактных классов, их можно использовать для создания ссылок на объекты.

Пример:

abstract class Figure{

double dim1, dim2;

Figure (double a, double b){dim1=a; dim2=b;}

abstract double area();

}

class Rect extends Figure {

Rect (double a, double b){super(a,b);}

double area(){ return dim1*dim2;}

}

class Triangle extends Figure{

Triangle(double a, double b){super(a,b);}

double area(){ return dim1*dim2/2;}

}

class Demo{

public Demo{

Rect r = new Rect(5.0,6.0);

Triangle t = new Triangle(7.0,8.0);

Figure f;

f = r;

f.area();

f = t;

f.area();

}}