OBJEKTINIS PROGRAMAVIMAS

Java this raktažodis

Raktažodis this nurodo dabartinį objektą – tą egzempliorių, kuriam šiuo metu vykdomas konstruktorius arba metodas.

Ką reiškia this?

Kiekvienas egzemplioriaus metodas ir konstruktorius vykdomas konkrečiam objektui. Jo viduje this yra nuoroda į tą objektą. Todėl per this galima pasiekti jo atributus ir metodus.

this negalima naudoti statiniame kontekste.

static metodas priklauso klasei, o ne konkrečiam objektui, todėl jame dabartinio objekto nėra.

Atributas ir tokio pat pavadinimo parametras

Konstruktoriaus arba metodo parametras gali turėti tokį pat pavadinimą kaip klasės atributas. Tokiu atveju this.atributas aiškiai nurodo objekto lauką:

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;

    Knyga(String pavadinimas, int puslapiuSkaicius) {
        this.pavadinimas = pavadinimas;
        this.puslapiuSkaicius = puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga("Mažasis princas", 96);
        System.out.println(knyga.pavadinimas);
        System.out.println(knyga.puslapiuSkaicius);
    }
}
Konsolės rezultatas

Mažasis princas
96

  1. Kuriant objektą konstruktoriui perduodamas pavadinimas ir puslapių skaičius.
  2. Parametro pavadinimas vardas sutampa su objekto atributo vardu.
  3. this.pavadinimas aiškiai reiškia kuriamo objekto atributą.
  4. Dešinėje esantis paprastas pavadinimas reiškia konstruktoriaus parametrą.
  5. Taip argumento reikšmės išsaugomos objekte ir vėliau parodomos konsolėje.
Perskaityk kaip paprastą sakinį.

this.pavadinimas = pavadinimas reiškia: „šio objekto pavadinimui priskirk parametro pavadinimas reikšmę“.

Kas nutinka praleidus this?

public class Knyga {
    int puslapiuSkaicius;

    Knyga(int puslapiuSkaicius) {
        puslapiuSkaicius = puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga(96);
        System.out.println(knyga.puslapiuSkaicius);
    }
}
Konsolės rezultatas

0

  1. Konstruktoriui perduodamas argumentas 96.
  2. Parametras puslapiuSkaicius paslepia tokio pat pavadinimo objekto atributą.
  3. Eilutė puslapiuSkaicius = puslapiuSkaicius parametrą priskiria jam pačiam.
  4. Objekto atributas nė karto nepasiekiamas ir negauna reikšmės 96.
  5. int atributo numatytoji reikšmė yra 0, todėl konsolėje matome nulį.
Teisinga eilutė būtų this.puslapiuSkaicius = puslapiuSkaicius;

this leistų Java suprasti, kad kairėje turime pakeisti objekto atributą.

Kito konstruktoriaus iškvietimas su this()

Forma this(...) iškviečia kitą tos pačios klasės konstruktorių. Taip galima suteikti numatytąsias reikšmes ir nekartoti inicializavimo kodo:

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;
    boolean perskaityta;

    Knyga(String pavadinimas) {
        this(pavadinimas, 0, false);
    }

    Knyga(String pavadinimas, int puslapiuSkaicius, boolean perskaityta) {
        this.pavadinimas = pavadinimas;
        this.puslapiuSkaicius = puslapiuSkaicius;
        this.perskaityta = perskaityta;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga("Užrašų knygelė");
        System.out.println(knyga.pavadinimas);
        System.out.println(knyga.puslapiuSkaicius);
        System.out.println(knyga.perskaityta);
    }
}
Konsolės rezultatas

Užrašų knygelė
0
false

  1. Objektas kuriamas perduodant tik pavadinimą Užrašų knygelė.
  2. Pirmasis konstruktorius iškviečia antrą konstruktorių su this(pavadinimas, 0, false).
  3. Taip trūkstamoms reikšmėms suteikiamos numatytosios reikšmės: 0 puslapių ir false.
  4. Antrasis konstruktorius visas tris reikšmes įrašo į dabartinio objekto atributus.
  5. Rezultate matome pilnai paruoštą objektą, nors iš pradžių perdavėme tik vieną argumentą.
this(...) turi būti pirmoji konstruktoriaus instrukcija.

To reikalauja Java, kad prieš kitus veiksmus objektas būtų tinkamai inicializuotas.

Dabartinio objekto metodo iškvietimas

Per this galima iškviesti ir kitą dabartinio objekto metodą:

public class Knyga {
    String pavadinimas = "Mažasis princas";

    void rodytiPavadinima() {
        System.out.println(this.pavadinimas);
    }

    void rodytiInformacija() {
        this.rodytiPavadinima();
        System.out.println("Knyga paruošta skaityti");
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.rodytiInformacija();
    }
}
Konsolės rezultatas

Mažasis princas
Knyga paruošta skaityti

  1. Metodas rodytiInformacija() vykdomas konkrečiam knyga objektui.
  2. Jo viduje this.rodytiPavadinima() iškviečia kitą to paties objekto metodą.
  3. Šis metodas per this.pavadinimas parodo dabartinio objekto pavadinimą.
  4. Programa grįžta į rodytiInformacija() ir parodo antrą tekstą.
  5. Šiuo atveju this nėra privalomas, bet aiškiai parodo, kad naudojamas dabartinis objektas.

Dabartinio objekto perdavimas

this yra objekto nuoroda, todėl ją galima perduoti kitam metodui kaip argumentą:

public class Knyga {
    String pavadinimas = "Mažasis princas";

    void pridetiIBiblioteka() {
        Biblioteka.prideti(this);
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        knyga.pridetiIBiblioteka();
    }
}

class Biblioteka {
    static void prideti(Knyga knyga) {
        System.out.println("Pridėta knyga: " + knyga.pavadinimas);
    }
}
Konsolės rezultatas

Pridėta knyga: Mažasis princas

  1. Sukuriamas konkretus Knyga objektas su pavadinimu Mažasis princas.
  2. Per šį objektą iškviečiamas metodas pridetiIBiblioteka().
  3. Metodo viduje this reiškia būtent tą knygos objektą.
  4. Objektas perduodamas kaip argumentas statiniam metodui Biblioteka.prideti().
  5. Bibliotekos metodas gauna knygą, perskaito jos pavadinimą ir parodo jį konsolėje.

Dažniausios this formos

Java this naudojimo formos
FormaPaskirtis
this.atributasPasiekti dabartinio objekto atributą
this.metodas()Iškviesti dabartinio objekto metodą
this(...)Iškviesti kitą tos pačios klasės konstruktorių
kitasMetodas(this)Perduoti dabartinį objektą kaip argumentą