Từ khóa this
Đã giới thiệuMột tham số có thể che khuất trường mà nó nên cập nhật
- Một đối tượng có tên "Ada". setName(String name) chạy code name = name; với đối số "Bo".
- Cả hai tên không qualifiy đều trỏ đến tham số, vì vậy đối tượng vẫn còn "Ada". this.name = name gán giá trị tham số vào trường thay vì thế.
"Đối tượng này"
- Bên trong một phương thức thực thể,
thistrỏ đến đối tượng mà phương thức đã được gọi trên.student.addScore(10)chạy vớithis=studentđó. this.scorecó nghĩa là "scorecủa đối tượng tôi đang làm việc." Nó cho phép một phương thức nói về đối tượng của chính nó một cách rõ ràng.
Phân biệt trường dữ liệu và tham số
- Công dụng chính: phân biệt biến thực thể với tham số có cùng tên.
void setName(String name) { this.name = name; } this.namelà biến thực thể; plainnamelà tham số. Đây là giải pháp chuẩn cho lỗi shadowing từ 3.8.
Truy cập vào đối tượng người nhận
thiscung cấp cho phương thức một tay cầm vào đúng đối tượng mà nó đã được gọi trên. Mọi phương thức thực thể đều có mộtthisẩn, dù bạn có viết hay không.- Khi score chỉ định một trường thực thể không bị che khuất,
score += s;sử dụngthis.score. Nếu một tham số hoặc biến cục bộ mang tên score che khuất nó, tên không qualifiy thay vào đó sẽ trỏ đến biến đó. Bạn chỉ viếtthisrõ ràng khi cần thiết (như khi giải quyết vấn đề che khuất).
this trỏ đến đối tượng nhận
Bên trong setName, this là đối tượng ada mà nó đã được gọi trên đó.
Bên trong một phương thức thực thể, this tham chiếu đến...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
this là một con trỏ đến đối tượng hiện tại.
Trong setName(String name) { this.name = name; }, this.name là...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
this.name là trường; plain name là tham số.
Từ khóa this có thể được sử dụng bên trong một phương thức tĩnh.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Phương thức tĩnh không có đối tượng cụ thể nào, vì vậy không có this.
Viết name = name; (không có this) bên trong setName(String name) làm gì?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Cả hai tên đều là tham số; hãy dùng this.name để truy cập trường dữ liệu.
Mọi phương thức thực thể đều có một this ngầm, dù bạn có viết hay không.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một phương thức thực thể có một nhận hiện tại. score không phân định chỉ tên this.score nếu không có tham số hay biến cục bộ nào che khuất trường này.
Không có this trong phương thức tĩnh
- Một phương thức tĩnh có không có
this— nó không bị gắn với bất kỳ đối tượng cụ thể nào. Vì vậy, một phương thức tĩnh không thể sử dụngthishoặc một trường thực thể không qualifiy, nhưng có thể đọc một trường thực thể thông qua tham chiếu rõ ràng khi quyền truy cập cho phép. - Cố gắng sử dụng
thistrong một phương thức tĩnh là một lỗi biên dịch. Nếu bạn cầnthis, phương thức phải là một phương thức thực thể, không phải tĩnh.
Dùng this.field = param; để khắc phục lỗi che khuất — this.name là biến thực thể, name thường trực tiếp là tham số. Viết name = name; (không có this) chỉ gán tham số cho chính nó. Và this không tồn tại trong phương thức tĩnh — phương thức tĩnh không có đối tượng cụ thể nào, nên dùng this ở đó sẽ không biên dịch được.
Type the field value after the faulty setName("Bo") call on the described object.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
Nếu alias và a trỏ đến cùng một Student, việc alias.setName("Di") sẽ thay đổi tên mà sau đó đọc qua a.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Cả hai tham chiếu đều xác định cùng một đối tượng nhận, mà trường của nó đã được cập nhật.
Code trong đối tượng b gọi a.setName("Cy"). Bên trong setName, đối tượng nào là this?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Nhận a cung cấp this, bất kể code của đối tượng nào khác đã khởi tạo lời gọi.
Sửa lỗi che khuất với this:
- Biến thực thể
private String name; void setName(String name) { this.name = name; }— đúng!this.name(trường dữ liệu) nhận giá trị từname(tham số).
Mở rộng suy luận sang trường hợp mới
- Vẽ a và b như hai sinh viên được tạo riêng biệt, tên là Ada và Bo.
a.setName("Cy")thay đổi a thành Cy trong khi b vẫn giữ nguyên là Bo. Nếu alias=a,alias.setName("Di")sẽ thay đổi cùng đối tượng đầu tiên đó, nên a giờ đọc là Di. - Receiver là đối tượng mà phương thức instance tác động lên, không nhất thiết là đối tượng có code gọi nó. Một phương thức static có thể hoạt động trên một tham chiếu đối tượng rõ ràng, nhưng không có this ẩn.
this trỏ đến đối tượng hiện tại — đối tượng mà phương thức thực thể được gọi trên đó. Mục đích chính của nó là giải quyết lỗi che khuất: this.name = name; gán tham số vào biến thực thể. Mọi phương thức thực thể đều có một this ngầm định, nhưng một phương thức tĩnh thì không có, nên this không thể dùng ở đó.