24 июн. 2015 г.

Классы. Часть 6 – this is magic.

Каждый раз при вызове обычного (не статического) метода, кроме явных аргументов, если они имеются, туда еще передается и не явный аргумент – this.

this хранит ссылку на объект из которого был вызван метод

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

Чтобы эта тарабарщина стала более понятной давайте рассмотрим простой пример из двух классов:

N0018

N0019

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

N0020

Как видно из кода класса Cow метод getThis() возвращает ссылку на текущий объект Cow, что и подтверждается выводом данной программы.

 

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

this.age = 5;

Чтобы стало понятней для чего это может быть нужно, рассмотрим еще один пример:

N0021

N0022

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

cow1 name = NoNaMe
cow1 name = Буренка

Мы чуток поменяли эти два класса. В классе Herd мы сперва вызываем метод setNoName() и передаем ему строку, но, как видно из вывода программы поле name не получает это значение, так как в этом методе про существу происходит бессмысленная операция – присвоение переменной name (объявленной в методе) значения самой себе. О чем нас, кстати, предупреждает Eclipse, показав значок предупреждения в строке 13 (вот как интересно совпала-то :) ).

Затем мы используем метод setName(), в 17 строке которого используется ключевое слово this и через точку имя поля, которому необходимо присвоить значение. По существу, в нашем случае, эту же операцию можно было сделать и следующим кодом в классе Herd:

cow1.name = "Буренка";

Разве эта строка не напоминает строку 17? this.name = name;

Те же самые яйца, только вид сбоку.

Кроме уже приведенного использования this, его можно использовать для вызова одних конструкторов класса из других. Вызвать один метод класса из другого метода очень просто – по имени. И даже если имена одинаковые, то работает правило перегрузки, а вот как вызывать конструкторы? У них же имя совпадает с именем класса.

Один метод из другого можно вызывать в любом месте метода, но вызов одного конструктора из другого может быть только в первой строке вызывающего конструктора. Например:

N0023

N0024

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

N0025

Как видно из вывода программы, конструкторы могут вызывать один другой, используя функционал вызываемого и добавляя свой.

Ну и в завершение предлагаю посмотреть очень хорошее видео на эту тему:

3 комментария:

  1. Доступ к видео ограничен автором, можно узнать что хоть в видео?

    ОтветитьУдалить
  2. Уппс! Да линки в сети дело не постоянное :) Я уж даже и не помню про что там было.

    ОтветитьУдалить
  3. Вот тут можно посмотреть это видео.

    http://www.youtube.com/watch?v=2Q4EAl65ePI

    Оно по видимому было переделано автором.

    ОтветитьУдалить