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 THIS
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 :
this reference = Main@23fc625e object reference = 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à this
từ khóa của lớp.
Ở đây, chúng ta có thể thấy rằng tham chiếu của cả obj và this
giố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à this
từ 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 this
từ 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 :
obj.age = 0
Trong ví dụ trên, chúng ta đã chuyển 8
dưới dạng giá trị cho hàm tạo. Tuy nhiên, chúng tôi đang nhận được 0
như 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 this
từ 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 có được sản lượng như mong đợi. Đó là bởi vì khi hàm tạo được gọi, this
bê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 phổ biến khác của this
từ khóa 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 this
từ khóa:
- to assign value inside the setter method
- to access value inside the getter method
Sử dụng điều này trong Nạp chồng khối lệnh
Trong khi làm việc với quá trình 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 this
từ 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 this
từ khóa,
- to call the constructor
Complex(int i, int j)
from the constructorComplex(int i)
- to call the constructor
Complex(int i)
from the constructorComplex()
Lưu ý dòng,
System.out.println(c1);
Ở đây, khi chúng ta in đối tượng c1 , đối tượng được chuyển đổi thành một chuỗi. Trong quá trình này, cái toString()
được gọi là. Vì chúng tôi ghi đè toString()
phương thức bên trong lớp của mình, chúng tôi nhận được kết quả đầu ra theo phương thức đó.
Một trong những lợi thế rất lớn của this()
nó là giảm số lượng mã trùng lặp. Tuy nhiên, chúng ta nên luôn cẩn thận trong khi sử dụng this()
.
Điều này là do việc gọi hàm tạo từ một hàm tạo khác sẽ thêm chi phí và nó là một quá trình chậm. Một lợi thế lớn khác của việc sử dụng this()
là giảm số lượng mã trùng lặp.
Lưu ý : Việc gọi một hàm tạo từ một hàm tạo khác được gọi là gọi hàm tạo rõ ràng.
Chuyển điều này làm đối số
Chúng ta có thể sử dụng this
từ khóa để chuyển đối tượng hiện tại làm đối số cho một phương thức. Ví dụ,
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 :
Before passing this to addTwo() method: x = 1, y = -2 After passing this to addTwo() method: 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ó như một đố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.