Có thể có rất nhiều cách sử dụng từ khóa this. Trong java, đây là một biến tham chiếu đề cập đến đối tượng hiện tại.
6 trường hợp sử dụng từ khóa this
Dưới đây là 6 cách sử dụng từ khóa this trong Java:
- this có thể được sử dụng để tham chiếu biến thể hiện của lớp hiện tại.
- this có thể được sử dụng để gọi phương thức lớp hiện tại (gọi ngầm)
- this() có thể được sử dụng để gọi hàm tạo của lớp hiện tại.
- this có thể được truyền như là một đối số trong lệnh gọi phương thức.
- this có thể được truyền như là đối số trong lệnh gọi hàm tạo.
- this có thể được sử dụng để trả về thể hiện của lớp hiện tại từ phương thức.
Gợi ý: Nếu bạn là người mới bắt đầu Học Java, hãy chỉ nên tìm hiểu 3 cách sử dụng từ khóa this.
Ví dụ 6 cách sử dụng từ khóa this trong Java
Để bạn hiểu rõ hơn về cách sử dụng từ khóa this. Mình sẽ lấy từng ví dụ theo từng cách để bạn nhìn thấy thực tế.
Cách #1: Sử dụng this để tham chiếu đến lớp hiện tại
Từ khóa this có thể được sử dụng để tham chiếu biến thể hiện của lớp hiện tại. Nếu có sự không rõ ràng giữa các biến đối tượng và tham số, từ khóa this sẽ giải quyết vấn đề không rõ ràng.
Trước tiên, hãy hiểu rõ hơn về tình huống không có từ khóa this:
Ví dụ, (file TestThis1.java):
class Student{
int id;
String name;
float weight;
Student(int id, String name, float weight){
id = id;
name = name;
weight = weight;
}
void display(){
System.out.println(id+" "+name+" "+weight);
}
}
class TestThis1{
public static void main(String args[]){
Student s1 = new Student(17, "Hải", 50.5f);
Student s2 = new Student(18, "Doanh", 60.2f);
s1.display();
s2.display();
}
}
Kết quả:
0 null 0.0
0 null 0.0
Trong ví dụ trên, các tham số (đối số chính thức) và các biến thể hiện có tên như nhau. Vì thế, nó dẫn tới việc trình biên dịch hiểu nhầm.
Do đó, chúng ta cần phải sử dụng từ khóa this này để phân biệt biến cục bộ và biến thể hiện, như sau:
File: TestThis2.java
class Student{
int id;
String name;
float weight;
Student(int id, String name, float weight){
this.id = id;
this.name = name;
this.weight = weight;
}
void display(){
System.out.println(id+" "+name+" "+weight);
}
}
class TestThis2{
public static void main(String args[]){
Student s1 = new Student(17, "Hải", 50.5f);
Student s2 = new Student(18, "Doanh", 60.2f);
s1.display();
s2.display();
}
}
Kết quả:
17 Hải 50.5
18 Doanh 60.2
Chương trình không sử dụng đến từ khóa this:
class Student{
int id;
String name;
float weight;
Student(int i, String n, float w){
id = i;
name = n;
weight = w;
}
void display(){
System.out.println(id+" "+name+" "+weight);
}
}
class TestThis3{
public static void main(String args[]){
Student s1 = new Student(17, "Hải", 50.5f);
Student s2 = new Student(18, "Doanh", 60.2f);
s1.display();
s2.display();
}
}
Kết quả nhận được:
17 Hải 50.5
18 Doanh 60.2
Note: Khi lập trình, cách tiếp cận tốt hơn là sử dụng tên có ý nghĩa cho các biến. Vì vậy, trong thực tế, người ta sử dụng cùng tên cho các biến và tham số và luôn sử dụng từ khóa this.
Cách #2: Sử dụng this để gọi phương thức của lớp hiện tại
Bạn có thể gọi phương thức của lớp hiện tại bằng cách sử dụng từ khóa this.
Nếu bạn không sử dụng từ khóa this, trình biên dịch sẽ tự động thêm từ khóa this trong khi gọi phương thức.
Hãy xem ví dụ:
File: TestThis4.java
class A{
void m(){
System.out.println("hello m");
}
void n(){
System.out.println("hello n");
//Sử dụng m();
//giống với this.m();
this.m();
}
}
class TestThis4{
public static void main(String args[]){
A a = new A();
a.n();
}
}
Kết quả:
hello m
hello n
Cách #3: Sử dụng this() để gọi constructor (Hàm tạo) của lớp hiện tại
Lệnh gọi hàm tạo this() có thể được sử dụng để gọi hàm tạo (constructor) của lớp hiện tại.
- Tìm hiểu về Hàm tạo trong Java
Nó được sử dụng để tái sử dụng các constructor. Nói cách khác, nó được sử dụng cho constructor chaining.
Ví dụ: Gọi hàm tạo mặc định từ hàm tạo tham số.
class A{
// Hàm tạo mặc định
A(){
System.out.println("hello a");
}
// Hàm tạo tham số
A(int x){
// Gọi hàm tạo mặc định
this();
System.out.println(x);
}
}
class TestThis5{
public static void main(String args[]){
A a = new A(10);
}
Kết quả:
hello a
10
Ví dụ: Gọi hàm tạo tham số từ hàm tạo mặc định.
class A{
// Hàm tạo mặc định
A(){
// Gọi hàm tạo tham số
this(5);
System.out.println("hello a");
}
// Hàm tạo tham số
A(int x){
System.out.println(x);
}
}
class TestThis6{
public static void main(String args[]){
// Khởi tạo đối tượng
A a = new A();
}
}
Kết quả:
5
hello a
Sử dụng this() để gọi constructor trong thực tế
Lệnh gọi hàm tạo this() nên được sử dụng để sử dụng lại hàm tạo từ hàm tạo.
Nó duy trì chuỗi giữa các hàm tạo, tức là nó được sử dụng cho constructor chaining.
Hãy xem ví dụ được đưa ra dưới đây để hiểu việc sử dụng thực tế của this().
class Student{
// Khai báo các biến
int id;
String name, sex;
float weight;
// Hàm tạo 3 tham số
Student(int id, String name, String sex){
this.id = id;
this.name = name;
this.course = course;
}
// Hàm tạo 4 tham số
Student(int id, String name, String sex, float weight){
this(id, name, course); //Sử dụng lại constructor
this.weight = weight;
}
// Hàm hiển thị thông tin sinh viên
void display(){
System.out.println(id+" "+name+" "+sex+" "+weight);}
}
class TestThis7{
public static void main(String args[]){
// Khởi tạo sinh viên
Student s1=new Student(17,"Hải","Nam");
Student s2=new Student(18,"Doanh","Nam", 60.2f);
// Hiển thị thông tin
s1.display();
s2.display();
}
}
Kết quả:
17 Hải Nam null
18 Doanh Nam 60.2
Lưu ý Quy tắc: this() phải là câu lệnh đầu tiên trong hàm tạo.
Ví dụ: Chúng ta thử đổi lại câu lệnh this() xuống bên dưới trong hàm tạo 4 tham số, và chạy thử:
class Student{
// Khai báo các biến
int id;
String name, sex;
float weight;
// Hàm tạo 3 tham số
Student(int id, String name, String sex){
this.id = id;
this.name = name;
this.course = course;
}
// Hàm tạo 4 tham số
Student(int id, String name, String sex, float weight){
this.weight = weight;
this(id, name, course); // Sai quy tắc
}
// Hàm hiển thị thông tin sinh viên
void display(){
System.out.println(id+" "+name+" "+sex+" "+weight);}
}
class TestThis7{
public static void main(String args[]){
// Khởi tạo sinh viên
Student s1=new Student(17,"Hải","Nam");
Student s2=new Student(18,"Doanh","Nam", 60.2f);
// Hiển thị thông tin
s1.display();
s2.display();
}
}
Kết quả:
Compile Time Error: Call to this must be first statement in constructor
Cách #4: Sử dụng this để truyền như một đối số
Từ khóa this cũng có thể được truyền như là một đối số trong phương thức.
Nó chủ yếu được sử dụng trong xử lý sự kiện. Hãy xem ví dụ:
class S2{
void m(S2 obj){
System.out.println("Phương thức được gọi");
}
void p(){
m(this);
}
public static void main(String args[]){
S2 s1 = new S2();
s1.p();
}
}
Kết quả:
Phương thức được gọi
Trong xử lý sự kiện (hoặc) trong tình huống chúng ta phải cung cấp tham chiếu của một lớp cho một lớp khác. this được sử dụng để tái sử dụng một đối tượng trong nhiều phương thức – Ứng dụng của cách truyền this như một đối số.
Cách #5: Truyền this như là đối số trong lệnh gọi hàm tạo
Chúng ta cũng có thể truyền từ khóa this trong hàm tạo. Nó rất hữu ích nếu chúng ta phải sử dụng một đối tượng trong nhiều lớp. Hãy xem ví dụ:
class B{
A4 obj;
B(A4 obj){
this.obj = obj;
}
void display(){
System.out.println(obj.data); // Sử dụng data member của lớp A4
}
}
class A4{
int data = 10;
A4(){
B b = new B(this);
b.display();
}
public static void main(String args[]){
A4 a = new A4();
}
}
Kết quả:
10
Cách #6: Từ khóa this sử dụng để trả về thể hiện của lớp hiện tại
Chúng ta có thể trả về từ khóa this như một tuyên bố từ phương thức.
Trong trường hợp như vậy, kiểu trả về của phương thức phải là kiểu class (không nguyên thủy). Hãy xem ví dụ:
Ví dụ cách bạn trả về this như một tuyên bố từ phương thức.
class A{
A getA(){
return this;
}
void msg(){
System.out.println("Hello java");}
}
class Test1{
public static void main(String args[]){
new A().getA().msg();
}
}
Kết quả:
Hello java
Để chứng minh rằng từ khóa this đề cập đến biến thể hiện của lớp hiện tại. Trong chương trình này, chúng ta đang in biến tham chiếu và this, kết quả của cả hai biến đều giống nhau.
class A5{
void m(){
System.out.println(this); // in this
}
public static void main(String args[]){
A5 obj = new A5();
System.out.println(obj); // in đối tượng
obj.m();
}
}
Kết quả:
A5@22b3ea59
A5@22b3ea59
Bạn đã hiểu cách sử dụng this trong Java chưa?
Qua bài này, bạn đã được tìm hiểu về 6 cách sử dụng từ khóa this trong Java.
Như đã nói từ trước, nếu bạn mới bắt đầu học lập trình Java thì chỉ nên tìm hiểu kỹ 3 cách sử dụng this đầu tiên mà thôi.
Sau khi đã hiểu kha khá về Java, lúc đấy nhìn vào các ví dụ trên bạn sẽ thấy đơn giản và dễ hiểu hơn rất nhiều. Đừng lo lắng.
- Còn muốn hiểu kỹ hơn ngay và luôn thì có thể tham gia Khóa học Lập trình Java Fullstack tại NIIT – ICT Hà Nội.
- Hoặc tự học Java thêm tại đây!
Chúc bạn học lập trình Java tốt!