Java - Ključna riječ - this


Ključna riječ - this

U Javi se ključna riječ this koristi za upućivanje na trenutni objekt unutar metode ili konstruktora. Pogledajmo primjer:

class Main {
    int instVar;

    Main(int instVar){
        this.instVar = instVar;
        System.out.println("ovu referencu = " + this);
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("objekt reference = " + obj);
    }
}

U gornjem primjeru stvorili smo objekt nazvan obj klase Main. Zatim ispisujemo referencu na objekt obj i this ključnu riječ klase. Ovdje možemo vidjeti da je referenca i za obj i za this ista. Znači da ovo nije ništa drugo nego referenca na trenutni objekt.



Upotreba ključne riječi - this

Postoje razne situacije u kojima se ključna riječ this često koristi.



Korištenje ključne riječi this za imena dvosmislenih varijabli

U Javi nije dopušteno deklarisati dvije ili više varijabli koje imaju isto ime unutar opsega (opseg klase ili opseg metode). Međutim, varijable i parametri instance mogu imati isto ime. Pogledajmo primjer:

class MyClass {
    // Instance varijable
    int age;

    // Parametri
    MyClass(int age){
        age = age;
    }
}

U gornjem programu varijabla instance i parametar imaju isto ime: age. Ovdje je Java prevodilac zbunjen zbog dvosmislenosti imena. U takvoj situaciji koristimo ključnu riječ this. Prvo, pogledajmo primjer bez upotrebe ključne riječi this:

class Main {

    int age;
    Main(int age){
        age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

U gornjem primjeru, konstruktoru smo prosljedili 8 kao vrijednost. Međutim, dobijamo 0 kao izlaz. To je zato što se Java prevodilac zbunjuje zbog dvosmislenosti u imenima između instance varijable i parametra. Sada, prepišimo gornji kod koristeći ključnu riječ this.

class Main {

    int age;
    Main(int age){
        this.age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

Sada dobijamo očekivani izlaz. To je zato što kad se konstruktor pozove, to unutar konstruktora zamjenjuje objekt obj koji je pozvao konstruktor. Zbog toga je varijabli age dodijeljena vrijednost 8. Takođe ako se ime parametra i varijable instance razlikuje, kompajler automatski dodaje ključnu riječ this. Pogledajmo sljedeći kod:

class Main {
    int age;

    Main(int i) {
        age = i;
    }
}

ekvivalentno je:

class Main {
    int age;

    Main(int i) {
        this.age = i;
    }
}

Još jedna uobičajena upotreba ključne riječi this je u metodama postavljanja i dobijanja (setter i getter) klase. Pogledajmo primjer:

class Main {
   String name;

   // setter metoda
   void setName( String name ) {
       this.name = name;
   }

   // getter metoda
   String getName(){
       return this.name;
   }

   public static void main( String[] args ) {
       Main obj = new Main();

       // Pozivanje setter i getter metode
       obj.setName("Apple");
       System.out.println("obj.name: "+obj.getName());
   }
}

Ovdje smo koristili ključnu riječ this:

  • za dodjeljivanje vrijednosti unutar metode setter
  • za pristup vrijednosti unutar metode getter


Koristeći ključne riječi this u preopterećenjima Constructor Overloading

Tokom rada s preopterećenjem konstruktora, možda ćemo morati pozvati jedan konstruktor iz drugog konstruktora. U takvom slučaju ne možemo eksplicitno pozvati konstruktor. Umjesto toga, moramo koristiti ključnu riječ this. Ovdje koristimo drugačiji oblik ključne riječi this. Odnosno, ovo (). Pogledajmo primjer:

class Complex {

    private int a, b;

    // Konstruktor sa 2 parametra
    private Complex( int i, int j ){
        this.a = i;
        this.b = j;
    }

    // Konstruktor s jednim parametrom
    private Complex(int i){
        // Pozivanje konstruktora sa 2 parametra
        this(i, i); 
    }

    // Konstruktor bez parametara
    private Complex(){
        // Pozivanje konstruktora s jednim parametrom
        this(0);
    }

    @Override
    public String toString(){
        return this.a + " + " + this.b + "i";
    }

    public static void main( String[] args ) {
  
        // Stvaranje objekta od Complex klase (class)
        // Poziva konstruktor sa 2 parametra
        Complex c1 = new Complex(2, 3); 
    
        // Poziv konstruktora s jednim parametrom
        Complex c2 = new Complex(3);

        // Poziv konstruktora bez parametara
        Complex c3 = new Complex();

        // Ispiši objekat
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
    }
}

U gornjem primjeru koristili smo ključnu riječ this:

  • da pozove kompleks konstruktora (int i, int j) iz kompleksa konstruktora (int i)
  • da pozove konstruktor Complex(int i) iz konstruktora Complex()

Primijetite liniju koda:

System.out.println(c1);

Ovdje, kada ispisujemo objekt c1, objekt se pretvara u string. U ovom se procesu poziva toString(). Budući da nadjačavamo metodu toString() unutar naše klase, dobijamo izlaz prema toj metodi. Jedna od ogromnih prednosti ključne riječi this() je smanjenje količine dupliciranog koda. Međutim, trebali bismo biti uvijek oprezni dok koristimo ključnu riječ this().



Prosljeđivanje ključne riječi this kao argument

Ključnu riječ this možemo koristiti za prosljeđivanje trenutnog objekta kao argumenta metode. Pogledajmo primjer:

class ThisExample {
    // Deklarisanje varijable
    int x;
    int y;

    ThisExample(int x, int y) {
       // Dodijeliti vrijednosti varijabli unutar konstruktora
        this.x = x;
        this.y = y;

        // Vrijednost x i y prije pozivanja add()
        System.out.println("Prije nego što ovo prenesete addTwo() metodu:");
        System.out.println("x = " + this.x + ", y = " + this.y);

        // Pozivanje metode add() prosljeđujući ovo kao argument
        add(this);

        // Vrijednost x i y nakon poziva add()
        System.out.println("Nakon što je ovo proslijedio addTwo() metodu:");
        System.out.println("x = " + this.x + ", y = " + this.y);
    }

    void add(ThisExample o){
        o.x += 2;
        o.y += 2;
    }
}

class Main {
    public static void main( String[] args ) {
        ThisExample obj = new ThisExample(1, -2);
    }
}

U gornjem primjeru, unutar konstruktora ThisExample(), primijetite liniju koda:

add(this);

Ovdje pozivamo metodu add() prosljeđujući ovo kao argument. Budući da ključna riječ this sadrži referencu na objekt obj klase, možemo promijeniti vrijednost x i y unutar metode add().