Каждый раз при вызове обычного (не статического) метода, кроме явных аргументов, если они имеются, туда еще передается и не явный аргумент – this.
this хранит ссылку на объект из которого был вызван метод
this может использоваться внутри любого метода для ссылки на текущий объект. То есть this всегда служит ссылкой на объект, из которого был вызван метод. Ключевое слово this можно использовать везде, где допускается ссылка на текущий объект.
Чтобы эта тарабарщина стала более понятной давайте рассмотрим простой пример из двух классов:
У программы следующий вывод:
Как видно из кода класса Cow метод getThis() возвращает ссылку на текущий объект Cow, что и подтверждается выводом данной программы.
Поскольку this указывает на текущий объект, то его можно использовать для явного указания обращений к полям текущего экземпляра класса, например:
this
.age = 5;Чтобы стало понятней для чего это может быть нужно, рассмотрим еще один пример:
Вывод у программы следующий:
cow1 name = NoNaMe
cow1 name = Буренка
Мы чуток поменяли эти два класса. В классе Herd мы сперва вызываем метод setNoName() и передаем ему строку, но, как видно из вывода программы поле name не получает это значение, так как в этом методе про существу происходит бессмысленная операция – присвоение переменной name (объявленной в методе) значения самой себе. О чем нас, кстати, предупреждает Eclipse, показав значок предупреждения в строке 13 (вот как интересно совпала-то :) ).
Затем мы используем метод setName(), в 17 строке которого используется ключевое слово this и через точку имя поля, которому необходимо присвоить значение. По существу, в нашем случае, эту же операцию можно было сделать и следующим кодом в классе Herd:
cow1
.name = "Буренка";Разве эта строка не напоминает строку 17? this.name = name;
Те же самые яйца, только вид сбоку.
Кроме уже приведенного использования this, его можно использовать для вызова одних конструкторов класса из других. Вызвать один метод класса из другого метода очень просто – по имени. И даже если имена одинаковые, то работает правило перегрузки, а вот как вызывать конструкторы? У них же имя совпадает с именем класса.
Один метод из другого можно вызывать в любом месте метода, но вызов одного конструктора из другого может быть только в первой строке вызывающего конструктора. Например:
Вывод у программы следующий:
Как видно из вывода программы, конструкторы могут вызывать один другой, используя функционал вызываемого и добавляя свой.
Ну и в завершение предлагаю посмотреть очень хорошее видео на эту тему:
Доступ к видео ограничен автором, можно узнать что хоть в видео?
ОтветитьУдалитьУппс! Да линки в сети дело не постоянное :) Я уж даже и не помню про что там было.
ОтветитьУдалитьВот тут можно посмотреть это видео.
ОтветитьУдалитьhttp://www.youtube.com/watch?v=2Q4EAl65ePI
Оно по видимому было переделано автором.