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

19. Ссылка на себя. Указатель this

Java содержит специальный указатель this. Это указатель, который автоматически передается любой функции-члену при ее вызове и указывает на объект, генерирующий вызов. Например, рассмотрим следующую инструкцию:

ob.f1( ); // предположим, что ob — это объект

Функции f1( ) автоматически передается указатель на объект ob. Этот указатель и называется this.

Указатель this передается только функциям-членам. Дружественным функциям указатель this не передается. Если функция-член работает с другим членом того же класса, она делает это без уточнения имени класса или объекта. Если вызывается функция-член, ей автоматически передается указатель this на объект, который является источником вызова.

Пример.

class samp {

int a, b;

public:

samp (int n, int m) { this->a = n; this->b = m; }

int get_a() { return this->a; }

int get_b() { return this->b; }

};

Указатель this необходим в том случае, когда функция, например, должна возвращать адрес объекта:

return* this;

Использование this необходимо в том случае, если имена параметров функции совпадают с именами элементов класса. В этом случае имя параметра скрывает имя элемента класса.

21. Зарезервированное слово super

Иногда возникает необходимость вызвать поле или метод из прародительского класса. Обычно это бывает в случаях, когда в классе-потомке задано поле с таким же именем (но, обычно, другим типом) или переопределён метод. В результате видимость прародительского поля данных или метода в классе-потомке утеряна. Иногда говорят, что поле или метод затеняются в потомке. В этих случаях используют вызов super.имяПоля или super.имяМетода(список параметров). Слово super в этих случаях означает сокращение от superclass. Если метод или поле заданы не в непосредственном прародителе, а унаследованы от более далёкого прародителя, соответствующие вызовы всё равно будут работать. Но комбинации вида super.super.имя не разрешены.

Использовать вызовы с помощью слова super разрешается только для методов и полей данных объектов. Для методов и переменных класса (то есть объявленных с модификатором static) вызовы с помощью ссылки super запрещены.