Con trỏ this trong Java là một trong các khái niệm cơ bản và quan trọng khi làm việc với đối tương và lớp. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về từ khóa this trong Java, cách sử dụng của nó cùng với các ví dụ dẫn chứng.
Con trỏ This
Trong Java, con trỏ this được sử dụng để tham chiếu đến đối tượng hiện tại bên trong một phương thức hoặc một phương thức khởi tạo.
Ví dụ:
class Main { private int a; Main(int b){ this.a = b; System.out.println(this.a); System.out.println(this); } public static void main(String[] args) { Main c = new Main(325); System.out.println(c); } }
Kết quả:
325 Main@2a139a55 Main@2a139a55
Trong ví dụ trên, chúng ta đã tạo một đối tượng có tên là c của lớp Main. Sau đó, chúng ta in ra tham chiếu đến đối tượng c và this của lớp Main. Ở đây, chúng ta có thể thấy rằng tham chiếu của cả c và this đều giống nhau. Nghĩa là this chính là đối tượng c.
Cách sử dụng của con trỏ this
Có nhiều trường hợp mà từ khóa this được sử dụng.
1. Sử dụng this cho các tên biến không rõ ràng
Trong Java, không được phép khai báo hai hoặc nhiều biến có cùng tên trong một phạm vi (phạm vi lớp hoặc phạm vi phương thức). Tuy nhiên, các biến và các tham số sẽ có thể có cùng tên.
Ví dụ:
class Main { private int a; Main(int a){ this.a = a; System.out.println(this.a); System.out.println(this); } public static void main(String[] args) { Main c = new Main(325); System.out.println(c); } }
Trong đoạn mã trên, biến của lớp Main là a và tham số cho hàm tạo có cùng tên là a. Do đó, ta cần sử dụng this để phân biệt 1 biến là của lớp Main và 1 biến là tham số được truyền.
Ví dụ: Giả sử đoạn mã dưới đây ta không sử dụng con trỏ this.
class Main { private int a; Main(int a){ a = a; } public static void main(String[] args) { Main c = new Main(325); System.out.println(c.a); } }
Kết quả:
0
Trong ví dụ trên, chúng ta đã truyền 325 làm giá trị tham số cho hàm tạo. Tuy nhiên, chúng ta nhận được kết quả là 0. Điều này là do trình biên dịch Java bị nhầm lẫn vì sự không rõ ràng trong tên biến của lớp và tham số của hàm tạo Main. Ngoài ra, nếu tên của tham số và tên biến của lớp là khác nhau, trình biên dịch sẽ tự động thêm con trỏ this cho biến của lớp.
Ví dụ:
class Main { private int a; Main(int b){ a = b; } public static void main(String[] args) { Main c = new Main(325); System.out.println(c.a); } }
Đoạn mã trên tương đương với đoạn mã bên dưới đây:
class Main { private int a; Main(int b){ this.a = b; } public static void main(String[] args) { Main c = new Main(325); System.out.println(c.a); } }
2. This được sử dụng với các phương thức Getters và Setters
Một cách sử dụng phổ biến khác của con trỏ this là trong các phương thức setters và getters của một lớp.
Ví dụ:
class Main { private int a; void setA(int a) { this.a = a; } int getA(){ return this.a; } public static void main(String[] args) { Main c = new Main(); c.setA(521); System.out.println(c.getA()); } }
Kết quả:
521
Trong đoạn mã, chúng ta đã sử dụng con trỏ this:
- Để gán giá trị bên trong phương thức setter (setA())
- Để truy cập giá trị bên trong phương thức getter (getA())
Sử dụng con trỏ this trong nạp chồng hàm tạo
Khi làm việc với nạp chồng hàm tạo, chúng ta có thể phải gọi một hàm tạo từ một hàm tạo khác. Trong trường hợp như vậy, chúng ta không thể gọi hàm tạo một cách rõ ràng. Thay vào đó, chúng ta phải sử dụng từ khóa this.
Ví dụ:
class Main { private int a, b; private Main(int a, int b){ this.a = a; this.b = b; } private Main(int a){ this(a, a); } private Main(){ this(0); } public static void main( String[] args ) { Main so1 = new Main(24, 56); Main so2 = new Main(34); Main so3 = new Main(); System.out.println(so1.a + " " + so1.b); System.out.println(so2.a + " " + so2.b); System.out.println(so3.a + " " + so3.b); } }
Kết quả:
24 56 34 34 0 0
Trong đoạn mã trên, ta đã sử dụng this để gọi:
- Hàm tạo Main(int a, int b) từ hàm tạo Main(int a)
- Hàm tạo Main(int a) từ hàm tạo Main()
Một trong những lợi thế lớn của việc sử dụng this() là giảm số lượng các đoạn mã trùng lặp. Tuy nhiên, chúng ta nên luôn cẩn thận khi sử dụng this (). Điều này là do việc gọi hàm tạo từ một hàm tạo khác sẽ làm cho quá trình hoạt động chậm lại.
Truyền this làm đối số
Chúng ta có thể sử dụng con trỏ this để truyền đối tượng hiện tại làm đối số cho một phương thức.
Ví dụ:
class abc { float a; float b; abc(float x, float y) { this.a = x; this.b = y; System.out.println(trung_binh_cong(this)); } float trung_binh_cong(abc d){ return ((d.a + d.b)/2); } } class Main { public static void main( String[] args ) { abc doi_tuong = new abc(4.6f,1.2f); } }
Kết quả:
2.9
Trong đoạn mã trên, chúng ta đã truyền this làm tham số cho hàm trung_binh_cong(). Vì this đại diện cho đối tượng của lớp mà gọi đến một hàm, và ta có thể truyền đối tượng cho một hàm, như vậy, ta có thể truyền this làm tham số cho hàm trung_binh_cong. Trong đó, this chính là doi_tuong được khai báo trong hàm main().
Trên đây là khái niệm và ví dụ cơ bản về con trỏ this trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài mới nhất trên tek4 nhé!
P/s: Cảm ơn mọi người!