Tại JavaRush, học viên được làm quen với từ khóa theo nghĩa đen ngay từ những bài giảng đầu tiên
và hóa ra là bạn chỉ cần gán một giá trị cho một biến
Tức là
Và bên dưới là mã chương trình với từ khóa
this
. Và theo thời gian nó trở nên rõ ràng ý nghĩa của nó. Nhưng nhiều người khi nhìn lại có lẽ sẽ thành thật tự nhủ rằng đã lâu rồi họ không thể nhận ra được ý nghĩa sâu sắc của từ khóa này. Trong bài viết này, chúng tôi vén bức màn bí mật về cách sử dụng từ khóa this
cho những người vẫn chưa thể tìm ra nó... Chào mừng bạn! Nếu bạn lấy sách tham khảo Java của Schildt , ở trang 171 bạn sẽ đọc được rằng this
cần phải có một từ khóa để một phương thức có thể tham chiếu đến đối tượng đã gọi nó. Đây thực sự có thể là kết thúc của nó. Nhưng chúng ta cần chi tiết cụ thể. Theo quy định, this
nó nên được sử dụng trong hai trường hợp:
- Khi biến thể hiện của lớp 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 hàm tạo của một loại (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 khác. Đây còn được gọi là lệnh gọi hàm tạo rõ ràng.
Ví dụ một - 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ớpHuman
mà trường "name" được xác định: Hãy name
tạo một setter cho biến (setter khá hoạt động và không có thủ thuật nào ở đây): Xin lưu ý rằng chúng ta đang chuyển biến cho phương thức (setter ) . Chúng tôi đã giới thiệu một biến mới và (nói chung) có thể gọi 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} của phương thức . Lưu ý rằng có một dòng trong setter: setName
String newName
setName
name = newName;
Trên thực tế, chúng tôi đã giới thiệu một biến mới newName
và gán nó cho một biến đã tồn tại trong lớp name
. Nhiều lập trình viên nghĩ rằng thật lạ khi giới thiệu một biến với một tên mới nếu cuối cùng chúng ta lại nói về cùng một thứ. Về tên trong lớp Human
. Do đó, các nhà phát triển ngôn ngữ đã nghĩ đến việc làm cho việc sử dụng một tên biến trở nên thuận tiện hơn. Nói cách khác, tại sao một biến lại có hai tên có nghĩa giống nhau. Tức là tôi muốn làm điều gì đó như thế này: Nhưng trong trường hợp này có một vấn đề phát sinh . Bây giờ chúng ta có hai biến được đặt tên giống nhau. Một cái String name
thuộc về lớp Human
, còn cái kia String name
thuộc về phương thức của nó setName
. Do đó, máy Java không biết bạn muốn nói đến biến nào khi bạn viết một chuỗi trong setter:
name = name;
Java lấy cái gần nhất - name
từ phương thức setName
:
name
từ phương thức này cho nó. Điều đó tất nhiên là không có ý nghĩa gì. Do đó, cần có một số cách để phân biệt một biến name
trong một lớp Human
với một biến name
trong một phương thức setName
. Để giải quyết vấn đề này, từ khóa đã được giới thiệu this
, trong trường hợp này sẽ chỉ ra rằng cần phải gọi một biến không phải của một phương thức, mà là của một lớp Human
:
this
nó sẽ đề cập đến đối tượng đang gọi, như đã nói ở đầu bài. Kết quả là tên của người đó setName
sẽ được đặt thông qua setter cho đối tượng được tạo. Dưới đây là mã không sử dụng từ khóa this
. Đoạn mã này tạo một đối tượng lớp Human
và đặt tên cho nó:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
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);
}
}
Vì vậy, nó this
tránh được việc đưa ra các biến mới để biểu thị cùng một thứ, điều này làm cho mã ít bị “quá tải” hơn với các biến bổ sung.
Ví dụ thứ hai - Sử dụng điều này để gọi hàm tạo một cách rõ ràng
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 (thật kỳ lạ) có một số hàm tạo và bạn không muốn viết lại mã khởi tạo được đưa ra trong hàm tạo trước đó trong một hàm tạo mới. Bối rối? Mọi thứ không đáng sợ như nó có vẻ. Hãy xem đoạn mã bên dưới, nó có hai hàm tạo lớpHuman
:
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){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
Ở đây trước tiên chúng ta có một hàm tạo hai tham số chấp nhận int age
và int weight
. Giả sử chúng tôi đã viết hai dòng mã trong đó:
this.age = age;
this.weight = weight;
và sau đó họ quyết định thêm một hàm tạo khác, với ba tham số, ngoài tuổi và cân nặng, còn có chiều cao. Trong hàm tạo mới, bạn có thể viết điều này:
this.age = age;
this.weight = weight;
this.height = height;
Nhưng thay vì lặp lại mã bạn đã viết trong hàm tạo này, bạn có thể sử dụng một 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 add the missing variable:
this.height = height;
Vì vậy, bạn đang nói với hàm tạo bằng ba tham số:
- gọi hàm tạo này, có hai tham số.
- và thêm biến còn thiếu.
this
được truyền cho tất cả các phương thức ngoại trừ các phương thức tĩnh (do đó tại sao nó this
thường được gọi là tham số ngầm) và có thể được sử dụng để chỉ đối tượng được gọi là phương thức. Không cần phải sợ từ khóa này, vì This
nó không đáng sợ.
GO TO FULL VERSION