- 1 1. Giới thiệu
- 2 3. Các trường hợp sử dụng chính của this
- 3 4. Những 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 Lokal
- 4.2 5.2 Chuỗi Constructor
- 4.3 5.3 Chuỗi Phương Thức
- 4.4 5.4 Truyền Instance Hiện Tại
- 4.5 6. Các Câu Hỏi Thường Gặp (FAQ)
- 4.6 Q1. Tôi có cần viết “this” mọi lúc không?
- 4.7 Q2. Điều gì xảy ra nếu tôi sử dụng this bên trong một phương thức static?
- 4.8 Q3. Sự khác biệt giữa this và super là gì?
- 4.9 Q4. Lợi ích của việc trả về this trong method chaining là gì?
- 4.10 Q5. Điều gì xảy ra nếu tôi quên sử dụng this khi cần thiết?
- 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 một 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/đối tượng nà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 và thân thiện với người mới. Bạn sẽ học các điểm then chốt 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, những lỗi phổ biến và các 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 sử 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 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ể hiệ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 để tham chiếu tới “đối tượng này”.
Đó chính là công dụ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ỏ qua 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 giá trị.
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 việc sao ché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);
Điều này được sử dụng rộng rãi trong các mẫu builder và lớp cấu hình.
3.4 Truyền Tham Chiếu Đến Phiên Bản Hiện Tại
Bạn có thể sử dụng “this” khi cần truyền phiên bản hiện tại đến 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. Những 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 this Không Thể Được Sử Dụng Trong Các Ngữ Cảnh static
Một phương thức hoặc biến static thuộc về chính lớp—không phải về một instance—vì vậy “this” không thể được sử dụng.
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 Sử Dụng Quá Nhiều this Có Thể Giảm Khả Năng Đọc
Sử dụng “this” không cần thiết có thể làm cho mã khó đọc hơn. Chỉ sử dụng khi cần thiết.
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 Không Nhầm Lẫn this Với super
- this → instance hiện tại
- super → lớp cha (superclass)
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 Lokal
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 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 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 Instance 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ác Câu Hỏi Thường Gặp (FAQ)
Q1. 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 vậy. Sử dụng nó khi:
- tên biến local và biến thành viên trùng lặp
- bạn muốn tham chiếu rõ ràng đến instance hiện tại
Q2. Điều gì xảy ra nếu tôi sử dụng this bên 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 instance.
Q3. Sự khác biệt giữa this và super là gì?
- this : instance hiện tại
- super : lớp cha
Q4. Lợi ích của việc trả về this trong method chaining là gì?
Nó cho phép các cuộc gọi liên tiếp trên cùng một instance, cải thiện tính dễ đọc.
Q5. Điều gì xảy ra nếu tôi quên sử dụng this khi cần thiết?
Các biến cục bộ có thể ghi đè lên biến thành viên, gây ra các phân công không đúng 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 sử dụng thực tế. Bạn đã họ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 constructor
- Cách tạo chuỗi phương thức
- Cách truyền instance hiện tại cho 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 nó đúng cách với “super”
Hiểu cách “this” hoạt động 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 nguyên tắc cơ bản của Java và áp dụng những khái niệm này trong mã thực tế.
