Witam serdecznie.
Do czego służy, jak mam rozumieć i kiedy używać słowa "this" ?
Np znam:
public class Klasa {
int x;
public Klasa(int x){
this.x=x;}
}
Podobnie przy metodach.
Ale kiedy używamy:
this(<jakas_zmienna>) ;
lub
return this;
Witam serdecznie.
Do czego służy, jak mam rozumieć i kiedy używać słowa "this" ?
Np znam:
public class Klasa {
int x;
public Klasa(int x){
this.x=x;}
}
Podobnie przy metodach.
Ale kiedy używamy:
this(<jakas_zmienna>) ;
lub
return this;
this
mówi, że odnosisz się do instancji klasy w której jesteś. Dzięki temu możesz przypisać zmiennej x
w obiekcie Klasa zmienną o tej samej nazwie bo dzięki this
kompilator wie że chodzi Ci o zmienną w obiekcie a nie parametr.
return this
jest po to, by zwrócić samego siebie. Jest to często używane w płynnych interfejsach (fluent interfaces) np we wzorcu budowniczy: https://en.wikipedia.org/wiki/Builder_pattern#Java
Zwracanie kółko this
w budowniczym pozwala na użycie takiej składni do budowania obiektu:
public Car construct() {
return builder.setWheels(4)
.setColor("Red")
.build();
}
Natomiast w kodzie:
public class Klasa {
int x;
public Klasa(int x){
this.x=x;
}
}
this.x
jest używany dlatego, że pole x
z klasy zostało przesłonięte (shadowing) przez to, że masz parametr kontruktora o tej samej nazwie. this.x
pozwala dostać się do tego przesłoniętego pola. Gdybyś zamiast tego napisał x = x
to to nie miałoby sensu, bo ten kod efektywnie nic by nie zrobił.
this
odnosi się do aktualnego obiektu, każda metoda w klasie działa w kontekście obiektu i this
będzie się odnosić do obiektu, w którego metodzie jesteśmy. Służy także do wywoływania innego konstruktora danej klasy, wtedy bez kropki, tak jak byśmy wołali funkcję w kodzie:
class Test {
int x;
public Test(){
this("param");// wywołanie jakiegoś innego konstruktora
}
public method(int x){
this.x = x;// polu klasy x przypisuje parametr funkcji też x
}
public method2(){
int x = 1;
print(this);// this jako odwołanie się do obiektu jako całość
print(x); // tutaj x to zmienna lokalna
print(this.x); // x jako pole klasy
}
}
Czyli:
this.jakaś_zmienna_klasy
;