Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.
Trong java, Từ khóa this có 6 cách sử dụng như sau:
- Từ khóa this có thể được dùng để tham chiếu tới biến instance của lớp hiện tại.
- this() có thể được dùng để gọi Constructor của lớp hiện tại.
- Từ khóa this có thể được dùng để gọi phương thức của lớp hiện tại.
- Từ khóa this có thể được truyền như một tham số trong phương thức.
- Từ khóa this có thể được truyền như một tham số trong phương Constructor.
- Từ khóa this có thể được dùng để trả về instance của lớp hiện tại.
Nội dung chính
- 1. Tham chiếu tới biến instance của lớp hiện tại.
- 2. Sử dụng this() gọi Constructor của lớp hiện tại.
- 3. Gọi phương thức của lớp hiện tại.
- 4. Sử dụng từ khóa this như một tham số của phương thức.
- 5. Sử dụng từ khóa this như một tham số của Constructor.
- 6. Sử dụng từ khóa this để trả về instance của lớp hiện tại.
1. Tham chiếu tới biến instance của lớp hiện tại.
Từ khóa this trong java có thể được dùng để tham chiếu tới biến instance của lớp hiện tại.
Nếu có sự trùng tên nhau giữa biến toàn cục và tham số khiến bạn bị phân vân. Từ khóa this sẽ giúp bạn giải quyết sự phân vân của bạn.
Bạn sẽ hiểu ra vấn đề nếu không dùng từ khóa this trong ví dụ sau:
public class Student10 { int id; String name; Student10(int id, String name) { id = id; name = name; } void display() { System.out.println(id + " " + name); } public static void main(String args[]) { Student10 s1 = new Student10(111, "Viet"); Student10 s2 = new Student10(222, "Nam"); s1.display(); s2.display(); } }
Kết quả:
0 null 0 null
Trong ví dụ trên, tên của tham số của Constructor Student10() trùng với tên của biến toàn cục đó là lý do tại sao cần phải sử dụng từ khóa this để phân biệt biến cục bộ và biến toàn cục.
Ví dụ dưới đây giải quyết vấn đề trên bằng cách sử dụng từ khóa this:
public class Student11 { int id; String name; Student11(int id, String name) { this.id = id; this.name = name; } void display() { System.out.println(id + " " + name); } public static void main(String args[]) { Student11 s1 = new Student11(111, "Viet"); Student11 s2 = new Student11(222, "Nam"); s1.display(); s2.display(); } }
Kết quả:
111 Viet 222 Nam
Nếu biến cục bộ và biến toàn cục có tên khác nhau thì không cần sử dụng từ khóa this.
public class Student12 { int id; String name; Student12(int i, String n) { id = i; name = n; } void display() { System.out.println(id + " " + name); } public static void main(String args[]) { Student12 e1 = new Student12(111, "Viet"); Student12 e2 = new Student12(222, "Nam"); e1.display(); e2.display(); } }
Kết quả:
111 Viet 222 Name
2. Sử dụng this() gọi Constructor của lớp hiện tại.
Phương thức this() có thể được sử dụng để gọi Constructor của lớp hiện tại. Cách sử dụng này sẽ hữu dụng hơn nếu bạn có nhiều Constructor trong một lớp và bạn muốn sử dụng lại Constructor.
Ví dụ:
public class Student13 { int id; String name; Student13() { System.out.println("call Constructor mặc định"); } Student13(int id, String name) { this(); // nó được sử dụng để gọi Constructor của lớp hiện tại this.id = id; this.name = name; } void display() { System.out.println(id + " " + name); } public static void main(String args[]) { Student13 e1 = new Student13(111, "Viet"); Student13 e2 = new Student13(222, "Nam"); e1.display(); e2.display(); } }
Kết quả:
call Constructor mặc định call Constructor mặc định 111 Viet 222 Nam
Ví trí sử dụng this() để gọi Constructor
this() được dùng để sự dụng lại Constructor trong Constructor khác. Nó duy trì 1 chuỗi các Constructor.
Ví dụ:
public class Student14 { int id; String name; String city; Student14(int id, String name) { this.id = id; this.name = name; } Student14(int id, String name, String city) { this(id, name);// now no need to initialize id and name this.city = city; } void display() { System.out.println(id + " " + name + " " + city); } public static void main(String args[]) { Student14 e1 = new Student14(111, "Viet"); Student14 e2 = new Student14(222, "Nam", "Ha Noi"); e1.display(); e2.display(); } }
Kết quả:
111 Viet null 222 Nam Ha Noi
Ví dụ:
public class Student15 { int id; String name; Student15() { System.out.println("default Constructor is invoked"); } Student15(int id, String name) { id = id; name = name; this();// must be the first statement } void display() { System.out.println(id + " " + name); } public static void main(String args[]) { Student15 e1 = new Student15(111, "karan"); Student15 e2 = new Student15(222, "Aryan"); e1.display(); e2.display(); } }
Kết quả:
Compile Time Error
3. Gọi phương thức của lớp hiện tại.
Bạn có thể sử dụng từ khóa this để gọi phương thức của lớp hiện tại. 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 cho việc gọi phương thức.
Hãy xem ví dụ sau để hiểu rõ hơn.
public class Example3 { void m() { System.out.println("Gọi phương thức bằng từ khóa this"); } void n() { this.m(); } void p() { n();// trình biên dịch sẽ thêm this để gọi phương thức n() như this.n() } public static void main(String args[]) { Example3 o1 = new Example3(); o1.p(); } }
Kết quả:
Gọi phương thức bằng từ khóa this
4. Sử dụng từ khóa this như một tham số của phương thức.
Từ khóa this có thể được dùng như một tham số trong phương thức. Cách dùng này chủ yếu được sử dụng trong sử lý sự kiện.
Hãy xem ví dụ sau để hiểu rõ hơn.
public class Example4 { void m(Example4 obj) { System.out.println("Hello Java"); } void p() { m(this); } public static void main(String args[]) { Example4 o1 = new Example4(); o1.p(); } }
Kết quả:
Hello Java
Từ khóa this được sử dụng như một tham số trong việc xử lý sự kiện hoặc trong trường hơp mà chúng ta phải cung cấp tham chiếu của một lớp cho một lớp khác.
5. Sử dụng từ khóa this như một tham số của Constructor.
Bạn cũng có thể truyền từ khóa this trong Constructor. Tính năng này 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.
Ví dụ:
class B { A4 obj; B(A4 obj) { this.obj=obj; } void display() { System.out.println(obj.data);// sử dụng biến thành viên 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
6. Sử dụng từ khóa this để trả về instance của lớp hiện tại.
Chúng ta có thể trả về instance của lớp hiện tại bằng cách sử dụng từ khóa this. Trong trường hợp này, kiểu trả về của phương thức phải là kiểu class (không là kiểu nguyên thủy).
Ví dụ:
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
Ví dụ chứng minh rằng từ khóa this tham chiếu tới biến instance của lớp hiện tại. Chúng ta in biến tham chiếu và this, kết quả của chúng là giống nhau.
class A5 { void m() { System.out.println(this); //in ra cung tham chieu ID } public static void main(String args[]) { A5 obj = new A5(); System.out.println(obj); //in tham chieu ID obj.m(); } }
Kết quả:
A5@22b3ea59 A5@22b3ea59