Java - this ključna riječ


this ključna riječ

U Javi se ova ključna riječ koristi za upućivanje na trenutni objekt unutar metode ili konstruktora. Na 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 za i obj i this ista. Znači da ovo nije ništa drugo nego referenca na trenutni objekt.



Upotreba this ključne riječi

Postoje razne situacije u kojima se thia ključna riječ č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. Na 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 this ključnu riječ. Prvo, pogledajmo primjer bez upotrebe this ključne riječi:

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 this ključnu riječ.

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 dobnoj varijabli dodijeljena vrijednost 8. Takođe ako se ime parametra i varijable instance razlikuje, kompajler automatski dodaje this ključnu riječ. 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 this ključne riječi je u metodama postavljanja i dobijanja klase. Na 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 this ključnu riječ:

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


Koristeći ključne riječi this u 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 this ključnu riječ. Ovdje koristimo drugačiji oblik this ključne riječi. 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); 
    
        // poziva konstruktor s jednim parametrom
        Complex c2 = new Complex(3);

        // poziva konstruktor 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 this ključnu riječ:

  • da pozove kompleks konstruktora (int i, int j) iz kompleksa konstruktora (int i)
  • pozvati 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 this() je smanjenje količine dupliciranog koda. Međutim, trebali bismo biti uvijek oprezni dok koristimo this() ključnu riječ.



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

Ključnu riječ this možemo koristiti za prosljeđivanje trenutnog objekta kao argumenta metode. Na 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);

        // pozovite metodu add() prosljeđujući ovo kao argument
        add(this);

        // rijednost 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 this ključna riječ sadrži referencu na objekt obj klase, možemo promijeniti vrijednost x i y unutar metode add().