U ovom ćemo članku naučiti o ovoj ključnoj riječi u Javi, kako i gdje ih koristiti uz pomoć primjera.
ovu ključnu 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("this reference = " + this); ) public static void main(String() args) ( Main obj = new Main(8); System.out.println("object reference = " + obj); ) )
Izlaz :
ova referenca = Main @ 23fc625e referenca objekta = Main @ 23fc625e
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 oba obj i this
ista. Znači da ovo nije ništa drugo nego referenca na trenutni objekt.
Upotreba ove ključne riječi
Postoje razne situacije u kojima se this
ključna riječ često koristi.
Koristeći ovo za imena varijabli dvosmislenosti
U Javi nije dopušteno deklarirati 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 variable int age; // parameter MyClass(int age)( age = age; ) )
U gornjem programu varijabla instance i parametar imaju isto ime: dob. Ovdje je Java prevodilac zbunjen zbog dvosmislenosti imena.
U takvoj situaciji koristimo ovu ključnu riječ. Na primjer,
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); ) )
Izlaz :
mc.age = 0
U gornjem primjeru smo 8
kao vrijednost proslijedili konstruktoru. Međutim, dobivamo 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 pomoću this
ključne riječi.
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); ) )
Izlaz :
obj.age = 8
Sad dobivamo očekivani izlaz. To je zato što kada se konstruktor pozove, this
unutar konstruktora se zamjenjuje objektom obj koji je pozvao konstruktor. Stoga je dobnoj varijabli dodijeljena vrijednost 8.
Također, ako je ime parametra i varijable instance različito, prevoditelj automatski dodaje ovu ključnu riječ. Na primjer, kôd:
class Main ( int age; Main(int i) ( age = i; ) )
ekvivalentno je:
class Main ( int age; Main(int i) ( this.age = i; ) )
ovo s Getterima i Setterima
Druga uobičajena upotreba this
ključne riječi je u metodama postavljanja i dobivanja klase. Na primjer:
class Main ( String name; // setter method void setName( String name ) ( this.name = name; ) // getter method String getName()( return this.name; ) public static void main( String() args ) ( Main obj = new Main(); // calling the setter and the getter method obj.setName("Toshiba"); System.out.println("obj.name: "+obj.getName()); ) )
Izlaz :
obj.name: Toshiba
Ovdje smo koristili this
ključnu riječ:
- za dodjeljivanje vrijednosti unutar metode postavljanja
- za pristup vrijednosti unutar getter metode
Koristeći ovo u preopterećenju konstruktora
Tijekom rada s preopterećenjem konstruktora, možda ćemo morati pozvati jedan konstruktor iz drugog konstruktora. U takvom slučaju ne možemo izričito nazvati konstruktor. Umjesto toga, moramo koristiti this
ključnu riječ.
Ovdje koristimo drugačiji oblik ove ključne riječi. Odnosno this()
. Uzmimo primjer,
class Complex ( private int a, b; // constructor with 2 parameters private Complex( int i, int j )( this.a = i; this.b = j; ) // constructor with single parameter private Complex(int i)( // invokes the constructor with 2 parameters this(i, i); ) // constructor with no parameter private Complex()( // invokes the constructor with single parameter this(0); ) @Override public String toString()( return this.a + " + " + this.b + "i"; ) public static void main( String() args ) ( // creating object of Complex class // calls the constructor with 2 parameters Complex c1 = new Complex(2, 3); // calls the constructor with a single parameter Complex c2 = new Complex(3); // calls the constructor with no parameters Complex c3 = new Complex(); // print objects System.out.println(c1); System.out.println(c2); System.out.println(c3); ) )
Izlaz :
2 + 3i 3 + 3i 0 + 0i
U gornjem primjeru koristili smo this
ključnu riječ,
- za pozivanje konstruktora
Complex(int i, int j)
iz konstruktoraComplex(int i)
- za pozivanje konstruktora
Complex(int i)
iz konstruktoraComplex()
Primijetite crtu,
System.out.println(c1);
Here, when we print the object c1, the object is converted into a string. In this process, the toString()
is called. Since we override the toString()
method inside our class, we get the output according to that method.
One of the huge advantages of this()
is to reduce the amount of duplicate code. However, we should be always careful while using this()
.
This is because calling constructor from another constructor adds overhead and it is a slow process. Another huge advantage of using this()
is to reduce the amount of duplicate code.
Note: Invoking one constructor from another constructor is called explicit constructor invocation.
Passing this as an Argument
We can use this
keyword to pass the current object as an argument to a method. For example,
class ThisExample ( // declare variables int x; int y; ThisExample(int x, int y) ( // assign values of variables inside constructor this.x = x; this.y = y; // value of x and y before calling add() System.out.println("Before passing this to addTwo() method:"); System.out.println("x = " + this.x + ", y = " + this.y); // call the add() method passing this as argument add(this); // value of x and y after calling add() System.out.println("After passing this to addTwo() method:"); 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); ) )
Izlaz :
Prije prosljeđivanja ove metode addTwo (): x = 1, y = -2 Nakon prosljeđivanja ove metode addTwo (): x = 3, y = 0
U gornjem primjeru, unutar konstruktora ThisExample()
, primijetite crtu,
add(this);
Ovdje pozivamo add()
metodu predajući to kao argument. Budući da ova ključna riječ sadrži referencu na objekt obj klase, možemo promijeniti vrijednost x i y unutar add()
metode.