Задать вопрос

Java ключевое слово this, как работает?

Всем привет!
Просьба пояснить для начинающего

Я знаю разные ситуации в которых можно использовать ключевое слово this в Java. Но одно определение мне до сих пор непонятно "ссылка на текущий обьект", на какой текущий?
Что если в классе не создано обьектов?
И самое главное, что если в классе несколько обьектов?
Какой из них "текущий"?

Я читал в одной статье что при создании класса неявно создаётся обьект класса, именно this на него и ссылается. Но тогда слово this не может заменять обьект при вызове переменной обьекта, по типу object.variable тоже самое что this.variable, но как это возможно? Ведь this указывает на некий обьект который мы не создавали. Кароче это определение совсем не ясное "текущий обьект".

ПС - Также не совсем понятно его использование (this и super) для вызова из одного конструктора другого, ни разу в жизни не пригодилось, и даже не могу представить ситуацию в которой такое может пригодится.

ПСС - Перечитал кучу статей, книг, видео, так и не понял сути "текущий обьект" так как не понятно что за обьект и что делать если обьектов нет или их несколько.
  • Вопрос задан
  • 11610 просмотров
Подписаться 3 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 4
GavriKos
@GavriKos
У вас путаница с терминами. Класс - это всего лишь "инструкция", "схема". Просто описанный в коде класс ничего не может делать. Чтобы он что то делал - нужно создать объект класса. Это делается явно через new.
Возьмем пример - ручка. У вас есть описание класса ручка. Но это еще не объект - всего лишь описание. Сделав New - вы создадите экземпляр ручки. И экземпляров может быть сколько угодно, и с разными параметрами (цвет, размер и прочее) - но все это ручки.

Так вот. this в ЭКЗЕМПЛЯРЕ указывает НА ЭТОТ САМЫЙ экземпляр.
Ответ написан
Похоже тут никто из комментаторов понятия не имеют, как на самом деле работает их код.

Вы пишите такой код:
class Foo {
  void foo(String str) { ... };
}
...
Foo f = new Foo();
f.foo("abc");


Компилятор же сгенерирует байткод, который примерно соответствует такому коду:
class Foo {
  static void foo(Foo this, String str) { ... };
}
...
Foo f = new Foo();
Foo.foo(f, "abc");


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

Так что по сути this это не обычное ключевое слово, это просто имя параметра в методе.
Ответ написан
Комментировать
Sputterspark
@Sputterspark
Методы всегда вызываются у объектов, а не классов, если они не статические. Вот на тот объект, у которого вызван метод, this и ссылается.
Ответ написан
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Если я правильно настроился на волну тс то разжую доступными словами.
Для начала нужно чтобы было правильное понимание происходящего в java а именно:
1) в java всё есть объект, вот прям все все* . Это означает что абсолютно что угодно отнаследовано от класса Object
2) есть(могут быть) различия того что именно содержится в классе в исходном коде и коде при выполнении программы а также после ее компиляции. Если простым языком то это может предстать так
- в коде у класса есть только метод foo()
- после компиляции оказывается что в нем после некоторых событий типа аннотаций появляется еще и метод bar(). Тут важно то что он появится * у всех инстансов от этого класса
- при выполнении может оказаться так что метод foo() будет подменен другим кодом. Это уже рефлексия.
- при выполнении может оказаться что у НЕКОТОРЫХ инстансов класса внутри окажется еще и метод mymethod(). Т.е. не у всех а именно у некоторых инстансов.
3) при выполнении программы * для абсолютно всего ВСЕГДА создается явно или не явно инстанс, даже для статического класса. Т.е. ты в коде может и не создавал инстанс явно через new, это было сделано рантаймом гдето в недрах явы!
4) статический класс отличается от обычного только тем что статический всегда указывает только и только* на 1 единственный инстанс
5) super() , означает что будет вызов метода\конструктора РОДИТЕЛЯ
6) super , БЕЗ СКОБОК, означает переход к переменным РОДИТЕЛЯ. Также можно вызвать и метод РОДИТЕЛЯ.
7) this всегда указывает именно на текущий инстанс класса. Другими словами представь что класс это область видимости и когда ты пишешь this ты явно говоришь что это относится именно к этому инстансу а не классу.

*гуру молчите что это не совсем так в особенных фундаментальных моментах
инстанс - экземпляр класса, т.е. грубо говоря он создается через new явно или не явно

Если всеравно непонятно то могу набросать примером простеньких. Также рекомендую почитать
это и примеры тут

Обобщая выше сказанное(с нюансами):
- в java ВСЁ и ВСЕГДА это инстанс какого либо класса
- исходя из пункта выше ВСЕГДА на любой класс существует хотябы один инстанс
- исходя из пункта выше часто бывают случаи когда необходимо обратиться к переменной\методу родителя через super. Также возникают необходимости обратиться к методу\переменной именно этого конкретного инстанса или передать этот инстанс куда либо дальше не имея ссылки на этот инстанс.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы