Trên CodeGym, sinh viên được làm quen với từ khóa Java this ngay từ những bài học đầu tiên. Theo thời gian, ý nghĩa của nó trở nên rõ ràng. Nhưng nhìn lại, có lẽ nhiều người tự thú nhận rằng lâu nay họ không hiểu được tính Thiền của từ khóa này. Bài viết này sẽ kéo lại bức màn che đậy bí mật của từ khóa this cho những ai chưa làm được... Tôi đã có tài liệu tham khảo về Java của Schildt rồi, đến trang 171 bạn có thể thấy từ khóa this là cần thiết cho một phương thức để tham chiếu đối tượng đã gọi nó. Chúng ta có thể kết thúc bài học với điều đó. Nhưng chúng ta cần chi tiết cụ thể. Theo quy định, bạn cần sử dụng điều này trong hai trường hợp:
Vì vậy, hóa ra bạn chỉ đơn giản gán biến tên của phương thức cho chính nó. Mà tất nhiên không có ý nghĩa gì. Do đó, ngôn ngữ cần một số cách để phân biệt biến name của lớp Human với biến name trong phương thức setName . Vấn đề này đã được giải quyết bằng cách giới thiệu từ khóa this , trong trường hợp này chỉ ra rằng bạn định tham chiếu đến biến được liên kết với một thể hiện của lớp Human , chứ không phải biến trong phương thức: Nói cách khác, this
đề cập đến đối tượng gọi, như chúng tôi đã đề cập ở đầu bài viết. Kết quả là, phương thức setName đặt tên của người đó trên đối tượng đã tạo. Dưới đây là mã chương trình không sử dụng từ khóa this . Đoạn mã tạo một đối tượng Human và gán tên cho nó:
Và đây là đoạn mã với từ khóa this :
- Khi một biến thể hiện và biến phương thức/hàm tạo có cùng tên;
- Khi bạn cần gọi một loại hàm tạo cụ thể (ví dụ: hàm tạo mặc định hoặc hàm tạo được tham số hóa) từ một loại hàm tạo khác. Đây cũng được gọi là lệnh gọi hàm tạo rõ ràng.
Ví dụ 1: Biến thể hiện và biến phương thức có cùng tên.
Giả sử chúng ta có một lớp Human định nghĩa một trường tên: Hãy tạo một bộ thiết lập cho biến tên (bộ thiết lập có đầy đủ chức năng — không có vấn đề gì ở đây):
class Human {
String name;
public void setName(String newName) {
name = newName;
}
}
Lưu ý rằng chúng tôi chuyển Chuỗi newName cho phương thức setName setter Chúng tôi đã khai báo một biến mới và có thể đặt tên cho nó là bất cứ thứ gì chúng tôi muốn vì nó sẽ chỉ hiển thị trong dấu ngoặc nhọn ({}) bao quanh phương thức setName . Lưu ý rằng setter có một dòng duy nhất:
name = newName;
Ở đây chúng tôi đã giới thiệu một biến mới gọi là newName và gán nó cho biến tên hiện có của đối tượng . Nhiều lập trình viên có thể thấy lạ khi giới thiệu một biến có tên mới khi cuối cùng chúng ta đang nói về cùng một thứ. Đó là, chúng ta đang nói về trường tên trong lớp Người . Đó là lý do tại sao những người tạo ra Java đã nghĩ ra một cách để sử dụng cùng một tên biến một cách thuận tiện. Nói cách khác, tại sao lại có hai tên cho một biến biểu thị cùng một thứ. Nói cách khác, chúng tôi muốn làm một cái gì đó như thế này:
class Human {
String name;
public void setName(String name) {
name = name;
}
}
Nhưng ở đây chúng ta gặp phải một vấn đề . Bây giờ chúng ta có hai biến có cùng tên. Một tên String thuộc về lớp Human , trong khi tên String khác thuộc về phương thức setName của nó . Do đó, JVM sẽ không biết bạn đang đề cập đến biến nào khi bạn viết dòng sau vào trình thiết lập:
name = name;
Java giả định rằng bạn muốn nói đến biến tên gần nhất , tức là biến từ phương thức setName : 


public class Solution {
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Vinny");
human1.print();
}
}
class Human {
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print() {
System.out.println(name);
}
}
Do đó, điều này cho phép chúng ta tránh đưa vào các biến mới để biểu thị cùng một thứ, làm cho mã sạch hơn và ít lộn xộn hơn với các biến phụ.
Ví dụ 2: Sử dụng điều này cho một lệnh gọi hàm tạo rõ ràng
Việc gọi một hàm tạo từ một hàm tạo khác có thể hữu ích khi bạn có (thật kỳ lạ) nhiều hàm tạo và bạn không muốn hàm tạo mới sao chép mã khởi tạo đã được viết trước đó trong một hàm tạo khác. Bối rối? Nó không quá đáng sợ như nó có vẻ. Nhìn vào mã dưới đây. Nó có hai hàm tạo cho lớp Human :
class Human {
int age;
int weight;
int height;
Human(int age, int weight) {
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height) {
// Call the constructor with two parameters
this(age, weight);
// and then initialize the missing variable
this.height = height;
}
}
Ở đây, trước tiên chúng tôi đã cung cấp một hàm tạo với hai tham số: int age và int weight . Giả sử nó có hai dòng mã:
this.age = age;
this.weight = weight;
Sau đó, chúng tôi quyết định thêm một hàm tạo khác có ba tham số, thêm chiều cao vào các tham số tuổi và cân nặng hiện có. Bạn có thể viết hàm tạo mới như thế này:
this.age = age;
this.weight = weight;
this.height = height;
Nhưng thay vì lặp lại mã hiện có trong hàm tạo này, bạn có thể sử dụng từ khóa this để gọi hàm tạo một cách rõ ràng với hai tham số:
this(age, weight);
// and then initialize the missing variable:
this.height = height;
Như thể chúng ta đang nói với hàm tạo ba tham số:
- gọi hàm tạo khác này có hai tham số
- và sau đó thêm một biến khác.
GO TO FULL VERSION