Вход/Регистрация
Философия Java3
вернуться

Эккель Брюс

Шрифт:

Ключевое слово this

Если у вас есть два объекта одинакового типа с именами а и Ь, вы, возможно, заинтересуетесь, каким образом производится вызов метода peel для обоих объектов:

//: initialization/BananaPeel.java

class Banana { voi'd peel (int i ){/*...*/} }

public class BananaPeel {

public static void main(String[] args) {

Banana a = new BananaO, b = new BananaO;

a.peel(l);

b.peel(2);

}

} ///:-

Если существует только один метод с именем peel, как этот метод узнает, для какого объекта он вызывается — а или Ь?

Чтобы программа могла записываться в объектно-ориентированном стиле, основанном на «отправке сообщений объектам», компилятор выполняет для вас некоторую тайную работу. При вызове метода peel передается скрытый первый аргумент — не что иное, как ссылка на используемый объект. Таким образом, вызовы указанного метода на самом деле можно представитьткак:

Banana.рееКаЛ);

Banana.peel(b,2);

Передача дополнительного аргумента относится к внутреннему синтаксису. При попытке явно воспользоваться ею компилятор выдает сообщение об ошибке, но вы примерно представляете суть происходящего.

Предположим, во время выполнения метода вы хотели бы получить ссылку на текущий объект. Так как эта ссылка передается компилятором скрытно, идентификатора для нее не существует. Но для решения этой задачи существует ключевое слово — this. Юночевое слово this может использоваться только внутри не-статического метода и предоставляет ссылку на объект, для которого был вызван метод. Обращаться с ней можно точно так же, как и с любой другой ссылкой на объект. Помните, что при вызове метода вашего класса из другого метода этого класса this вам не нужно; просто укажите имя метода. Текущая ссылка this будет автоматически использована в другом методе. Таким образом, продолжая сказанное:

//: initialization/Apricot.java public class Apricot {

void pickO { /* .. */ } void pit { pickO; /*..*/} } ///:-

Внутри метода pit можно использовать запись this.pick, но в этом нет необходимости9. Компилятор сделает это автоматически. Ключевое слово this употребляется только в особых случаях, когда вам необходимо явно сослаться на текущий объект. Например, оно часто применяется для возврата ссылки на текущий объект в команде return:

//: initialization/Leaf.java // Simple use of the "this" keyword.

public class Leaf { int i = 0; Leaf increment О { i++;

return this;

}

void printO {

System, out. printlnC'i = " + i).

}

public static void main(String[] args) { Leaf x = new LeafO;

x.i ncrement.i ncrement i ncrement.pri nt О;

}

} /* Output: i = 3 *///:-

Так как метод increment возвращает ссылку на текущий объект посредством ключевого слова this, над одним и тем же объектом легко можно провести множество операций.

Ключевое слово this также может пригодиться для передачи текущего объекта другому методу:

//. initialization/PassingThis java

class Person {

public void eat(Apple apple) {

Apple peeled = apple.getPeeledО; System.out.println("Yummy");

}

}

class Peeler {

static Apple peel(Apple apple) {

продолжение &

// .. Снимаем кожуру

return apple; // Очищенное яблоко

}

}

class Apple {

Apple getPeeledO { return Peeler.peel(this); }

}

public class PassingThis {

public static void main(String[] args) { new Person О eat (new AppleO);

}

} /* Output: Yummy *///.-

Класс Apple вызывает Peeler.peel — вспомогательный метод, который по какой-то причине должен быть оформлен как внешний по отношению к Apple (может быть, он должен обслуживать несколько разных классов, и вы хотите избежать дублирования кода). Для передачи текущего объекта внешнему методу используется ключевое слово this.

Вызов конструкторов из конструкторов

Если вы пишете для класса несколько конструкторов, иногда бывает удобно вызвать один конструктор из другого, чтобы избежать дублирования кода. Такая операция проводится с использованием ключевого слова this.

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

// initialization/Flower.java // Calling constructors with "this" import static net.mindview.util.Print.*;

public class Flower { int petal Count = 0; String s = "initial value"; Flower(int petals) {

  • Читать дальше
  • 1
  • ...
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: