Java cái này: Sử dụng nó ở đâu và như thế nào?

Trong bài viết này, chúng ta sẽ tìm hiểu về từ khóa này trong Java, cách sử dụng chúng ở đâu và như thế nào với sự trợ giúp của các ví dụ.

từ khóa này

Trong Java, từ khóa này được sử dụng để tham chiếu đến đối tượng hiện tại bên trong một phương thức hoặc một phương thức khởi tạo. Ví dụ,

 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); ) )

Đầu ra :

 tham chiếu này = Tham chiếu đối tượng Main @ 23fc625e = Main @ 23fc625e

Trong ví dụ trên, chúng ta đã tạo một đối tượng có tên là obj của lớp Main. Sau đó, chúng tôi in tham chiếu đến đối tượng obj và thistừ khóa của lớp.

Ở đây, chúng ta có thể thấy rằng tham chiếu của cả obj và thisgiống nhau. Nó có nghĩa là đây không là gì ngoài tham chiếu đến đối tượng hiện tại.

Sử dụng Từ khoá này

Có nhiều tình huống mà thistừ khóa thường được sử dụng.

Sử dụng điều này cho các tên biến mơ hồ

Trong Java, không được phép khai báo hai hoặc nhiều biến có cùng tên trong một phạm vi (phạm vi lớp hoặc phạm vi phương thức). Tuy nhiên, các biến cá thể và tham số có thể có cùng tên. Ví dụ,

 class MyClass ( // instance variable int age; // parameter MyClass(int age)( age = age; ) )

Trong chương trình trên, biến instance và tham số có cùng tên: age. Ở đây, trình biên dịch Java bị nhầm lẫn do sự không rõ ràng về tên.

Trong tình huống như vậy, chúng tôi sử dụng từ khóa này. Ví dụ,

Đầu tiên, hãy xem một ví dụ mà không sử dụng thistừ khóa:

 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 ra :

 mc.age = 0

Trong ví dụ trên, chúng ta đã truyền 8dưới dạng giá trị cho hàm tạo. Tuy nhiên, chúng tôi đang nhận được 0như một đầu ra. Điều này là do trình biên dịch Java bị nhầm lẫn vì sự không rõ ràng trong tên giữa cá thể biến và tham số.

Bây giờ, hãy viết lại đoạn mã trên bằng thistừ khóa.

 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); ) )

Đầu ra :

 obj.age = 8

Bây giờ, chúng tôi đang đạt được sản lượng như mong đợi. Đó là bởi vì khi hàm tạo được gọi, thisbên trong hàm tạo được thay thế bằng đối tượng obj đã được gọi là hàm tạo. Do đó, biến age được gán giá trị 8.

Ngoài ra, nếu tên của tham số và biến phiên bản khác nhau, trình biên dịch sẽ tự động thêm từ khóa này. Ví dụ, mã:

 class Main ( int age; Main(int i) ( age = i; ) )

tương đương với:

 class Main ( int age; Main(int i) ( this.age = i; ) )

điều này với Getters và Setters

Một cách sử dụng thistừ khóa phổ biến khác là trong các phương thức setters và getters của một lớp. Ví dụ:

 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()); ) )

Đầu ra :

 obj.name: Toshiba

Ở đây, chúng tôi đã sử dụng thistừ khóa:

  • để gán giá trị bên trong phương thức setter
  • để truy cập giá trị bên trong phương thức getter

Sử dụng điều này trong Nạp chồng khối lệnh

Trong khi làm việc với việc nạp chồng phương thức khởi tạo, chúng ta có thể phải gọi một phương thức khởi tạo từ một phương thức khởi tạo khác. Trong trường hợp như vậy, chúng ta không thể gọi hàm tạo một cách rõ ràng. Thay vào đó, chúng ta phải sử dụng thistừ khóa.

Ở đây, chúng tôi sử dụng một dạng khác của từ khóa này. Đó là this(),. Hãy lấy một ví dụ,

 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); ) )

Đầu ra :

 2 + 3i 3 + 3i 0 + 0i

Trong ví dụ trên, chúng tôi đã sử dụng thistừ khóa,

  • để gọi hàm tạo Complex(int i, int j)từ hàm tạoComplex(int i)
  • để gọi hàm tạo Complex(int i)từ hàm tạoComplex()

Lưu ý dòng,

 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); ) )

Đầu ra :

 Trước khi chuyển nó đến phương thức addTwo (): x = 1, y = -2 Sau khi chuyển nó đến phương thức addTwo (): x = 3, y = 0

Trong ví dụ trên, bên trong hàm tạo ThisExample(), hãy để ý dòng,

 add(this);

Ở đây, chúng tôi đang gọi add()phương thức bằng cách chuyển nó làm đối số. Vì từ khóa này chứa tham chiếu đến đối tượng obj của lớp, chúng ta có thể thay đổi giá trị của x và y bên trong add()phương thức.

thú vị bài viết...