W JavaRush studenci zapoznają się ze słowem kluczowym dosłownie od pierwszych wykładów
i okazuje się, że po prostu przypisujesz wartość zmiennej
Oznacza to,
A poniżej kod programu ze słowem kluczowym
this
. Z czasem staje się jasne, co to oznacza. Ale wielu, patrząc wstecz, prawdopodobnie szczerze powie sobie, że przez długi czas nie mogli zrozumieć zen tego kluczowego słowa. W tym artykule uchylamy zasłonę tajemnic używania słów kluczowych this
tym, którzy wciąż nie mogą tego rozgryźć... Witamy! Jeśli sięgniesz do podręcznika Java Schildta , na stronie 171 przeczytasz, że this
wymagane jest słowo kluczowe, aby metoda mogła odwoływać się do obiektu, który ją wywołał. To właściwie może być koniec. Ale potrzebujemy konkretów. Z reguły this
należy go stosować w dwóch przypadkach:
- Gdy zmienna instancji klasy i zmienna metody/konstruktora mają tę samą nazwę;
- Kiedy trzeba wywołać konstruktor jednego typu (na przykład konstruktor domyślny lub sparametryzowany) z innego. Nazywa się to również jawnym wywołaniem konstruktora.
Przykład pierwszy - zmienna instancji i zmienna metody mają tę samą nazwę
Załóżmy, że mamy klasęHuman
, dla której zdefiniowano pole „nazwa”: Stwórzmy name
seter dla zmiennej (setter działa całkiem nieźle i nie ma tu żadnego triku): Pamiętaj, że przekazujemy zmienną do metody (setter ) . Wprowadziliśmy nową zmienną i (ogólnie) mogliśmy ją nazwać jak chcieliśmy, ponieważ byłaby ona widoczna tylko w {nawiasach klamrowych} metody . Zauważ, że w seterze znajduje się jedna linia: setName
String newName
setName
name = newName;
Oznacza to, że tak naprawdę wprowadziliśmy nową zmienną newName
i przypisaliśmy ją do zmiennej już istniejącej w klasie name
. Wielu programistów uważało za dziwne wprowadzanie zmiennej o nowej nazwie, jeśli w końcu mówimy o tym samym. O nazwie w klasie Human
. Dlatego twórcy języka pomyśleli o ułatwieniu używania jednej nazwy zmiennej. Innymi słowy, po co mieć dwie nazwy zmiennej, która oznacza to samo. To znaczy chciałbym zrobić coś takiego: Ale w tym przypadku pojawia się problem . Mamy teraz dwie zmienne o tej samej nazwie. Jeden String name
należy do klasy Human
, a drugi String name
do jej metody setName
. Dlatego maszyna Java nie wie, którą zmienną masz na myśli, pisząc ciąg znaków w seterze:
name = name;
Java bierze najbliższą - name
z metody setName
:
name
z tej metody, do niej. Co oczywiście nie ma żadnego sensu. Dlatego potrzebny był jakiś sposób na odróżnienie zmiennej name
od klasy Human
od zmiennej name
od metody.Aby setName
rozwiązać ten problem, wprowadzono słowo kluczowe this
, które w tym przypadku będzie wskazywało, że należy wywołać zmienną nie metody, ale z klasy Human
:
this
że będzie odnosił się do obiektu wywołującego, jak powiedziano na początku artykułu. W rezultacie imię osoby setName
zostanie ustawione przez setera na utworzony obiekt. Poniżej znajduje się kod bez użycia słowa kluczowego this
. Kod tworzy obiekt klasy Human
i nadaje mu nazwę:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
W ten sposób this
unika się wprowadzania nowych zmiennych oznaczających to samo, co sprawia, że kod jest mniej „przeciążony” dodatkowymi zmiennymi.
Przykład drugi — użycie tego do jawnego wywołania konstruktora
Wywoływanie jednego konstruktora z drugiego może być przydatne, gdy (co dziwne) masz kilka konstruktorów i nie chcesz przepisywać kodu inicjującego podanego wcześniej w konstruktorze w nowym konstruktorze. Zdezorientowany? Wszystko nie jest tak straszne, jak się wydaje. Spójrz na poniższy kod, ma on dwa konstruktory klasHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//wywołujesz konstruktora z dwoma parametrami
this(age, weight);
//i dodaj brakującą zmienną
this.height = height;
}
}
Tutaj najpierw mamy konstruktor dwuparametrowy, który akceptuje int age
i int weight
. Powiedzmy, że napisaliśmy w nim dwie linijki kodu:
this.age = age;
this.weight = weight;
a następnie postanowiono dodać kolejnego konstruktora z trzema parametrami, który oprócz wieku i wagi przyjmuje także wzrost. W nowym konstruktorze możesz napisać to:
this.age = age;
this.weight = weight;
this.height = height;
Zamiast jednak powtarzać kod, który już napisałeś w tym konstruktorze, możesz użyć słowa kluczowego, aby this
jawnie wywołać konstruktor z dwoma parametrami:
this(age, weight);
// i dodaj brakującą zmienną:
this.height = height;
Mówisz więc konstruktorowi za pomocą trzech parametrów:
- wywołaj tego konstruktora, który ma dwa parametry.
- i dodaj brakującą zmienną.
this
jest przekazywane do wszystkich metod z wyjątkiem metod statycznych (stąd this
często nazywane jest parametrem ukrytym) i może być użyte do odniesienia się do obiektu, który wywołał metodę. Tego słowa kluczowego nie trzeba się bać, bo This
ono nie jest straszne.
GO TO FULL VERSION