Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры-1 оопип часть 4.doc
Скачиваний:
30
Добавлен:
01.04.2014
Размер:
112.64 Кб
Скачать

25. Класс Object

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

Конструктор:

Object()

Методы:

protected Object clone() - Создает и возвращает копию этого объекта

protected void finalize() - Вызывается сборщиком мусора когда нет больше ссылок на объект

Class getClass() - Возвращает класс во время выполнения

int hashCode() - Возвращает hash код для объекта

void notify() - Возобновляет единичный поток, который ожидает на объектном мониторе

void notifyAll() - Возобновляет все потоки, которые ожидают на объектном мониторе

String toString() - Возвращает строковое представление объекта

void wait() - Остановка текущего потока пока другой поток не вызовет notify() или notifyAll метод для этого объекта

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

При разработке иерархии классов часто возникает необходимость расширить возможности метода наследуемого из родительского класса. В этом случае в производном классе необходимо разработать свой метод с точно такой же сигнатурой, как и метод родительского класса (тип возврата имя (список параметров). Если, например, в производном классе метод с тем же именем и типом возвращаемого значения будет иметь различное количество или список параметров, то в этом случае будет реализована перегрузка метода. Т.е. в производном классе будет существовать не один (переопределенный) метод, а 2 различных метода с тем же именем и вариант метода будет выбираться в зависимости от фактических параметров конкретного вызова.

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

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

В следующем примере иллюстрируется динамическая диспетчеризация методов.

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

class А {

void callme() {

System.out.println("Внутри метода callme класса A");

}

}

class В extends A {

// переопределение метода callme()

void callme() {

System.out.println("Внутри метода callme класса В");

}

}

class С extends A {

// переопределение метода callme()

void callme() {

System.out.println("Внутри метода callme класса С");

}

}

class Dispatch {

public static void main(String args []) {

A a = new A(); // объект типа А

В b = new В ();// объект типа В

С с = new С (); // объект типа С

А r; // получение ссылки типа А

r = а; //r ссылается на объект А r.callme(); // вызов версии метода callme, определенной в А

r = b; // r ссылается на объект В

r.callme(); // вызов версии метода callme, определенной в В

r = с; //r ссылается на объект С

r.callme(); // вызов версии метода callme, определенной в С

}

}

Эта программа генерирует следующий вывод:

Внутри метода callme класса А Внутри метода callme класса В Внутри метода callme класса С

Эта программа создает один суперкласс А и два его подкласса: В и С. Подклассы В и С переопределяют метод callme (), объявленные в классе А. Внутри метода main () программа объявляет объекты типов А, В и С. Программа объявляет также ссылку типа А по имени г. Затем программа по очереди присваивает переменной г ссылку на каждый тип объекта и использует эту ссылку для вызова метода callme (). Как видно из вывода, выполняемая версия метода callme () определяется по типу объекта ссылки во время выполнения. Если бы выбор осуществлялся по типу ссылочной переменной, г, вывод отражал бы три обращения к методу callme () класса А.