6 Cách sử dụng THIS trong JAVA

0
2175
Từ khóa this trong Java

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.

Từ khóa this trong Java
Từ khóa this trong Java

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:

  1. this có thể được sử dụng để tham chiếu biến thể hiện của lớp hiện tại.
  2. this có thể được sử dụng để gọi phương thức lớp hiện tại (gọi ngầm)
  3. this() có thể được sử dụng để gọi hàm tạo của lớp hiện tại.
  4. this có thể được truyền như là một đối số trong lệnh gọi phương thức.
  5. this có thể được truyền như là đối số trong lệnh gọi hàm tạo.
  6. 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ộ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.

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.

Chúc bạn học lập trình Java tốt!

JavaDEV