Historia pytania:
W Javie, podobnie jak w innych językach zorientowanych obiektowo, stosuje się mechanizm wskaźników na bieżący obiekt. W Javie wprowadzono słowo kluczowe this, które pozwala wyraźnie odwoływać się do bieżącej instancji.
Problem:
Bez użycia this mogą wystąpić niejednoznaczne sytuacje, gdy lokalna zmienna (np. parametr konstruktora lub metody) zaciemnia pole instancji. Czasami konieczne jest także przekazanie bieżącego obiektu do innego komponentu lub wywołanie jego metod wewnątrz samej klasy.
Rozwiązanie:
Słowo kluczowe this:
Przykład:
public class Person { private String name; public Person(String name) { this.name = name; // Rozwiązanie konfliktu między polami a parametrami } }
Główne cechy:
Czy można odwoływać się do niestatycznych metod i pól bez this?
Tak. Wewnątrz metod klasy nie jest konieczne używanie this: kompilator domyślnie odnosi się do niestatycznych członków bieżącego obiektu. Użycie this staje się obowiązkowe, gdy występuje niejednoznaczność (np. gdy parametry konstruktora zaciemniają pola).
Czy this może być używane w metodzie statycznej lub blokach statycznych?
Nie. W kontekście statycznym zmienna this nie istnieje, ponieważ elementy statyczne nie zależą od konkretnej instancji.
Czy wywołanie this(...) (przeciążonego konstruktora) może być nie pierwszą linią konstruktora?
Nie. Wywołanie innego konstruktora za pomocą this musi być pierwszą linią konstruktora, w przeciwnym razie wystąpi błąd kompilacji.
Programista pisze konstruktor bez użycia this, a pola instancji nie są poprawnie inicjalizowane:
public class A { private int a; public A(int a) { a = a; } // Błąd! }
Zalety:
Wady:
Konstruktor wyraźnie używa this do rozwiązania kolizji nazw i inicjalizacji pola:
public class A { private int a; public A(int a) { this.a = a; } }
Zalety:
Wady: