- 1 1. Giới thiệu
- 2 3. Các trường hợp sử dụng chính của this
- 3 4. Lưu Ý Quan Trọng Khi Sử Dụng this
- 4 5. Các Ví Dụ Mã Thực Tế
- 4.1 5.1 Phân Biệt Biến Thành Viên và Biến Cục Bộ
- 4.2 5.2 Xâu Chuỗi Constructor
- 4.3 5.3 Xâu Chuỗi Phương Thức
- 4.4 5.4 Truyền Đối Tượng Hiện Tại
- 4.5 6. Câu Hỏi Thường Gặp (FAQ)
- 4.6 Câu Hỏi 1. Tôi có cần viết “this” mọi lúc không?
- 4.7 Câu Hỏi 2. Điều gì sẽ xảy ra nếu tôi dùng this trong một phương thức static?
- 4.8 Câu Hỏi 3. Sự khác nhau giữa this và super là gì?
- 4.9 Câu Hỏi 4. Lợi ích của việc trả về this trong xâu chuỗi phương thức là gì?
- 4.10 Câu hỏi 5. Điều gì sẽ xảy ra nếu tôi quên sử dụng this khi cần?
- 4.11 7. Kết luận
1. Giới thiệu
Khi bạn bắt đầu học lập trình Java, bạn sẽ gặp nhiều từ khóa khác nhau. Trong số đó, “this” đóng vai trò rất quan trọng trong việc hiểu các lớp và khái niệm hướng đối tượng. Tuy nhiên, vì từ “this” trong tiếng Anh chỉ có nghĩa là “cái này/đây”, nhiều người mới bắt đầu ban đầu cảm thấy không rõ tại sao nó lại được dùng trong lập trình.
Bài viết này giải thích vai trò và cách sử dụng từ khóa “this” trong Java một cách rõ ràng, thân thiện với người mới. Bạn sẽ học các điểm chính như phân biệt biến thành viên và biến cục bộ và sử dụng “this” trong các constructor, kèm theo các ví dụ mã thực tế.
Chúng tôi cũng sẽ đề cập đến các câu hỏi thường gặp, lỗi phổ biến và những lưu ý quan trọng. Khi đọc xong hướng dẫn này, bạn sẽ hiểu cách hoạt động của từ khóa this và biết cách dùng nó một cách tự tin từ các tình huống cơ bản đến nâng cao.
2. “this” là gì?
Trong Java, “this” chỉ tới đối tượng hiện tại. Khi một thể hiện (đối tượng) được tạo ra từ một lớp, từ khóa “this” được dùng để tham chiếu tới đối tượng cụ thể đó.
Ngay cả khi có nhiều đối tượng được tạo ra từ cùng một lớp, mỗi đối tượng sẽ có this riêng, chỉ tới chính thể hiện của nó. Điều này giúp làm rõ “đối tượng nào đang được thao tác” trong mã của bạn.
Các vai trò cơ bản của this
- Truy cập biến và phương thức của thể hiện: Sử dụng
this.tênBiếnhoặcthis.tênPhươngThức()cho phép bạn truy cập các biến và phương thức của đối tượng cụ thể. - Phân biệt giữa biến cục bộ và biến thành viên: Khi tham số của constructor hoặc phương thức có cùng tên với biến thành viên, “this” được dùng để phân biệt chúng.
Tại sao chúng ta cần “this”?
Trong Java, bạn có thể tạo nhiều đối tượng từ một lớp duy nhất, mỗi đối tượng có trạng thái và hành vi độc lập. Bên trong các đối tượng này, bạn cần một cách để chỉ tới “đối tượng này”. Đó chính là chức năng của từ khóa “this”.
Ví dụ, trong một lớp Person, việc dùng “this” cho phép bạn diễn đạt “đối tượng Person cụ thể này”.
Tóm tắt
“this” là một khái niệm rất quan trọng trong lập trình hướng đối tượng. Nó hoạt động như một cầu nối cho phép một đối tượng truy cập dữ liệu và hành vi của chính mình.
3. Các trường hợp sử dụng chính của this
Từ khóa “this” xuất hiện ở nhiều nơi trong Java. Dưới đây là một số ví dụ tiêu biểu kèm theo mẫu mã.
3.1 Phân biệt biến thành viên và biến cục bộ
Java thường dùng cùng một tên cho tham số của constructor và biến thành viên. Trong những trường hợp này, “this” được dùng để phân biệt chúng.
Ví dụ: Phân biệt biến thành viên và biến cục bộ
public class Student {
private String name;
public Student(String name) {
this.name = name; // Left: member variable, Right: constructor parameter
}
}
Nếu bạn bỏ this, biến cục bộ sẽ được ưu tiên, và biến thành viên sẽ không được gán đúng.
3.2 Sử dụng this trong Constructors
Java cho phép định nghĩa nhiều constructor thông qua overloading. Bạn có thể gọi một constructor khác bằng this() để giảm thiểu việc lặp lại mã.
Ví dụ: Gọi một constructor khác bằng this()
public class Book {
private String title;
private int price;
public Book(String title) {
this(title, 0); // calls another constructor
}
public Book(String title, int price) {
this.title = title;
this.price = price;
}
}
Điều này giúp tập trung logic khởi tạo và tránh trùng lặp mã.
3.3 Method Chaining
Trả về this cho phép gọi các phương thức liên tiếp trên cùng một thể hiện.
Ví dụ: Method chaining
public class Person {
private String name;
private int age;
public Person setName(String name) {
this.name = name;
return this;
}
public Person setAge(int age) {
this.age = age;
return this;
}
}
// Method chaining
Person p = new Person().setName("佐藤").setAge(25);
Cách này thường được dùng trong các pattern builder và các lớp cấu hình.
3.4 Truyền Đối Tượng Hiện Tại
Bạn có thể sử dụng “this” khi cần truyền đối tượng hiện tại cho một phương thức hoặc lớp khác.
Ví dụ: Truyền đối tượng hiện tại
public class Printer {
public void print(Person person) {
System.out.println(person);
}
}
public class Person {
public void show(Printer printer) {
printer.print(this); // passes this instance
}
}
4. Lưu Ý Quan Trọng Khi Sử Dụng this
Mặc dù rất hữu ích, “this” phải được sử dụng cẩn thận để tránh lỗi.
4.1 Không Thể Dùng this Trong Ngữ Cảnh static
Một phương thức hoặc biến static thuộc về lớp chứ không phải một đối tượng—do đó không thể dùng “this”.
Ví dụ không hợp lệ
public class Example {
private int value;
public static void printValue() {
// System.out.println(this.value); // Compile error
}
}
4.2 Lạm Dụng this Có Thể Giảm Độ Đọc
Việc sử dụng “this” không cần thiết có thể làm cho mã khó đọc hơn. Chỉ dùng khi thực sự cần.
Ví dụ về việc sử dụng không cần thiết
public class Test {
private int x;
public void setX(int x) {
this.x = x; // needed
// this.x = this.x + 1; // excessive use
}
}
4.3 Đừng Nhầm Lẫn this Với super
- this → đối tượng hiện tại
- super → lớp cha (siêu lớp)
Ví dụ: Sử dụng this so với super
public class Parent {
public void greet() {
System.out.println("Parent method");
}
}
public class Child extends Parent {
public void greet() {
System.out.println("Child method");
super.greet();
}
}
5. Các Ví Dụ Mã Thực Tế
5.1 Phân Biệt Biến Thành Viên và Biến Cục Bộ
public class Account {
private String owner;
public Account(String owner) {
this.owner = owner;
}
public void printOwner() {
System.out.println("Account Owner: " + this.owner);
}
}

5.2 Xâu Chuỗi Constructor
public class Rectangle {
private int width;
private int height;
public Rectangle(int width) {
this(width, 1);
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public void printSize() {
System.out.println("Size: " + width + " x " + height);
}
}
5.3 Xâu Chuỗi Phương Thức
public class BuilderExample {
private String name;
private int age;
public BuilderExample setName(String name) {
this.name = name;
return this;
}
public BuilderExample setAge(int age) {
this.age = age;
return this;
}
public void printInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
BuilderExample person = new BuilderExample().setName("山田").setAge(30);
person.printInfo();
5.4 Truyền Đối Tượng Hiện Tại
public class Notifier {
public void notifyUser(User user) {
System.out.println(user.getName() + " has been notified.");
}
}
public class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return this.name; }
public void sendNotification(Notifier notifier) {
notifier.notifyUser(this);
}
}
Notifier notifier = new Notifier();
User user = new User("佐藤");
user.sendNotification(notifier);
6. Câu Hỏi Thường Gặp (FAQ)
Câu Hỏi 1. Tôi có cần viết “this” mọi lúc không?
A.
Không phải lúc nào cũng cần. Hãy dùng khi:
- tên biến cục bộ và biến thành viên trùng nhau
- bạn muốn tham chiếu rõ ràng tới đối tượng hiện tại
Câu Hỏi 2. Điều gì sẽ xảy ra nếu tôi dùng this trong một phương thức static?
A.
Bạn sẽ nhận được lỗi biên dịch. Các phương thức static thuộc về lớp, không phải một đối tượng.
Câu Hỏi 3. Sự khác nhau giữa this và super là gì?
- this : đối tượng hiện tại
- super : lớp cha
Câu Hỏi 4. Lợi ích của việc trả về this trong xâu chuỗi phương thức là gì?
Nó cho phép gọi liên tiếp trên cùng một đối tượng, cải thiện khả năng đọc.
Câu hỏi 5. Điều gì sẽ xảy ra nếu tôi quên sử dụng this khi cần?
Các biến cục bộ có thể ghi đè lên các biến thành viên, gây ra việc gán sai và lỗi.
7. Kết luận
Bài viết này giải thích từ khóa “this” trong Java từ cơ bản đến cách sử dụng thực tế. Bạn đã học được:
- Cách phân biệt biến thành viên và biến cục bộ
- Cách tập trung logic của constructor
- Cách tạo chuỗi gọi phương thức
- Cách truyền đối tượng hiện tại tới các phương thức khác
Chúng tôi cũng đã đề cập đến các lưu ý quan trọng như:
- “this” không thể được sử dụng trong ngữ cảnh tĩnh
- Không lạm dụng “this”
- Sử dụng đúng cách với “super”
Hiểu cách hoạt động của “this” sẽ làm cho thiết kế lớp Java của bạn rõ ràng hơn và giảm lỗi. Tiếp tục khám phá các nền tảng Java và áp dụng những khái niệm này vào mã thực tế.
