Podstawy JAVA. Do czego służy this? Zastosowania.

0

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;

1

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.

3

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ł.

2

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:

  • czytelne podkreślenie, że odwołujemy się do pola klasy, a nie do innej zmiennej: this.jakaś_zmienna_klasy;
  • odwołanie się do obiektu jako całości;
  • wywołanie innych konstruktorów z konstruktora klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1