Tìm Hiểu Về Từ Khóa This Trong Java

Tìm Hiểu Về Từ Khóa This Trong Java

This là một từ khóa rất quan trọng trong Java nói riêng và lập trình hướng đối tượng nói chung, this trong tiếng nghĩa là "cái này", trong lập trình thì nó nghĩa là chính đối tượng này. Nó tham chiếu ngược lại đến đối tượng, giúp bạn có thể truy xuất đến các giá trị của đối tượng đó.

Dùng làm tham chiếu tới biến instance

Mục đích của việc sử dụng từ khóa this ở đây là để phân biệt đâu là biến và đâu là thuộc tính của lớp khi chúng trùng tên với nhau. Điều này thể hiện rõ ràng nhất thông qua constuctor. 

public class Circle
{
   private int radius;
   
   public Circle(int radius)
   {
      radius = radius;
   }

   public static void Main(string[] args)
   {
       Circle circle = new Circle(4); //Khởi tạo một circle có radius = 4

       System.out.println(circle.radius); //In giá trị của radiusra màn hình
   }
   //Output: 0
}

Ở đây mình khởi tạo một constructor có tham số radius dùng để khởi tạo bán kính cho hình tròn nhưng tham số này lại trùng tên với thuộc tính radius trong class Circle. Trong hàm Main() sẽ khởi tạo đối tượng của lớp Circle với radius bằng 4 sau đó sẽ in giá trị của radius ra ngoài màn hình và cầu nguyện sẽ in 4 ra màn hình.

Nhưng không, giá trị bạn nhận được là 0(giá trị mặc định biến khi khởi tạo). Lí do là ở đây compiler không phân biệt được đâu là tham số và đâu là thuộc tính của class. Vì vậy bạn cần dùng một thứ để phân biệt tham số và thuộc tính của class.

public class Circle
{
   private int radius;
   
   public Circle(int radius)
   {
      this.radius = radius;
   }

   public static void Main(string[] args)
   {
       Circle circle = new Circle(4); //Khởi tạo một circle có radius = 4

       System.out.println(circle.radius); //In giá trị của radiusra màn hình
   }
   //Output: 4
}

Gọi tới một Constructor khác bên trong Class

Khi thiết kế một class có thể chúng ta sẽ  tạo nhiều Constructor cho nhiều mục đích khác nhau. Lúc này có khả năng Constructor nhiều tham số hơn sẽ cần gọi tới Constructor ít tham số hơn. Với trường hợp này thì this như là một hàm nên chúng ta phải sử dụng this dưới dạng this() hoặc this(tham_số)

public class Student{
    int id;
    String name;

    Student(){
        System.out.println("Constructor mac dinh");
        //Constructor mặc định
    }

    Student(int id){
        this();
        this.id = id;
    }

    Student(int id, String name){
        this(id);
        this.name = name;
    }
    public void display(){
        System.out.println("id : "+ id);
        System.out.println("name : "+ name);
    }
}

//File TEST.java
public class TEST {
    public static void main(String[] args){
        Student std_1 = new Student(1510510); //Khởi tạo một sinh viên có id là 1510510
        std_1.display();
        Bike std_2 = new Bike(1510510,"Steven");//Khởi tạo một sinh viên có id là 1510510 và tên Steven
        std_2.display();
    }
}
 

Output lúc này sẽ là:

Constructor mac dinh
id : 1510510
name : null
Constructor mac dinh
id : 1510510
name : Steven

Một điều cần lưu ý là this() chỉ được dùng trong các constructor, nếu dùng this() trong các phương thức bình thường khác thì bị báo lỗi. Và nếu muốn sử dụng this() thì phải thì this() phải là dòng code đầu tiên bên trong một constructor. Nếu code như ví dụ dưới đây thì sẽ bị compiler báo lỗi ngay và luôn.

public class HinhChuNhat {
	private int chieuDai;
	private int chieuRong;
	
	public HinhChuNhat()
	{}
	
	public HinhChuNhat(int chieuDai, int chieuRong)
	{
		this.chieuDai = chieuDai;
		this.chieuRong = chieuRong;
		this(); //Compiler sẽ báo lỗi ở dòng này
	}
}

Dùng để trả về lớp hiện tại

Trên thực tế thì dùng this trong trường hợp này sẽ làm bạn bối rối một chút. Theo dõi đoạn code sau đây nhé.

public class Student {
 
    public String name;
    public int id;
 
    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }
 
    public Student getStudent() {
        return this;
    }
}

//File TEST.java
public class TEST {
    public static void main(String[] args){
        Student std = new Student("Steven", 1);
        System.out.println("Student's name: " + std.getStudent().name);
        System.out.println("Student's id: " + std.getStudent().id;
    }
}

Ở hàm getStudent() trả về this, là instance của lớp Student. Ở hàm main(), std là instance của Student, gọi đến hàm getStudent(), hàm getStudent() thì lại trả về một instance của lớp Student nên sẽ gọi đến thuộc tính name của lớp đó :D. Điều này bối rối thật sự khi bạn có thể dễ dàng truy xuất thuộc tính name như sau:

//File TEST.java
public class TEST
{ 
    public static void main(String[] args)
    {
        Student std = new Student("Steven", 1);
 
        System.out.println("Student's name: " + std.name);
        System.out.println("Student's id: " + std.id);
    }
 
}

Tạm kết

Trong phạm vi bài viết này mình đã giải thích cho các bạn tầm quan trọng của từ khóa this cũng như cách sử dụng chúng trong lập trình hướng đối tượng. Bài này khá cơ bản cho những bạn đang bắt đầu với lập trình hướng đối tượng nên hi vọng các bạn nắm vững kiến thức này nhé. Thanks ~