Post

Từ khoá This

Khi làm việc với Java được một thời gian dài, các bạn có lẽ đã nghe qua thuộc tính của lớp và biến của hàm. Nhưng làm sao phân biệt được hai khái niệm này?

Đôi khi người lập trình đặt tên chúng y hệt nhau khiến việc xử lý đôi khi gặp chút khó khăn. Hoặc khi làm việc với đối tượng và các hàm xây dựng, muốn gọi qua lại giữa các hàm xây dựng thì bạn sẽ làm như thế nào? Làm thế nào để tận dụng code có sẵn của các hàm mà không cần viết lại nhiều lần?

Dám chắc rằng bạn sẽ bối rồi khi cần giải quyết vấn đề như thế. Tuy nhiên trong Java, bạn chỉ cần sử dụng một từ thôi đã đủ để giải quyết các vấn đề trên – đó chính là this.

1. This trong Java là gì?

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.

Hay nói theo cách khác, từ khóa this dùng để ánh xạ đối tượng hiện tại. Giống như trong lớp NgườiYêu có rất nhiều đối tượng như Thảo, An, Uyên, Trang,… thì khi xử lý các thuộc tính và phương thức ta sẽ dùng từ “em” để ám chỉ đối tượng hiện tại cần thực hiện.

2. Cách sử dụng từ khóa this trong Java

Trong Java, this tuy ngắn gọn như có tổng cộng tất cả 6 cách sử dụng.

Tham chiếu tới biến instance của lớp hiện tại

Đây là cách mà this giúp bạn phân biệt giữa biến toàn cục và tham số khi tên của chúng hoàn toàn giống nhau. Phần code ví dụ bên dưới hy vọng sẽ giúp bạn hiểu ra vấn đề.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ReferInstanceVariables {
	int a;
	int b;

	// Hàm xây dựng chứa tham số
	ReferInstanceVariables(int a, int b) {
		this.a = a;
		this.b = b;
	}

	void display() {
		// Hiển thị giá trị của biến a và b
		System.out.println("a = " + a + "\nb = " + b);
	}

	public static void main(String[] args) {
		ReferInstanceVariables object = new ReferInstanceVariables(1, 99);
		object.display();
	}
}

Sử dụng this() gọi Constructor của lớp hiện tại

Cách này được ưu tiên sử dụng nếu chương trình có nhiều Constructor và có nhu cầu sử dụng lại.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class InvokeConstructor {
	int a;
	int b;

	// Hàm xây dựng mặc định
	InvokeConstructor() {
		this(1, 99);
		System.out.println("Hàm xây dựng mặc định \n");
	}

	// Hàm xây dựng chứa tham số
	InvokeConstructor(int a, int b) {
		this.a = a;
		this.b = b;
		System.out.println("Tham số mặc định");
	}

	public static void main(String[] args) {
		InvokeConstructor object = new InvokeConstructor();
	}
}

Trả về biến instance của lớp hiện tại

Đặc biệt lưu ý rằng kiểu trả về của phương thức phải là kiểu class. Nếu không tin bạn hãy thử in ra biến tham chiếu và this để kiểm tra.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ReturnInstance {
	int a;
	int b;

	// Hàm xây dựng mặc định
	ReturnInstance() {
		a = 1;
		b = 99;
	}

	// Phương thức trả về biến instance của lớp
	ReturnInstance get() {
		return this;
	}

	// Hiện thị giá trị của a và b
	void display() {
		System.out.println("a = " + a + "\nb = " + b);
	}

	public static void main(String[] args) {
		ReturnInstance object = new ReturnInstance();
		object.get().display();
	}
}

Sử dụng làm đối số của phương thức

Thông thường thì this trong trường hợp này được sử dụng nhiều đối với các chương trình có liên quan đến các yêu cầu xử lý sự kiện.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MethodParameter {
	int a;
	int b;

	// Hàm xây dựng mặt đinh
	MethodParameter() {
		a = 1;
		b = 99;
	}

	// Phương thức này nhận this như là một tham số
	void display(MethodParameter obj) {
		System.out.println("a = " + obj.a + "\nb = " + obj.b);
	}

	// Trả về biến instance của lớp
	void get() {
		display(this);
	}

	public static void main(String[] args) {
		MethodParameter object = new MethodParameter();
		object.get();
	}
}

Sử dụng để gọi phương thức của lớp hiện tại

Nhưng trên thực tế, nếu bạn quên hoặc không sử dụng từ khoá this, trình biên dịch của Java sẽ tự động thay bạn thêm từ khoá this cho việc gọi phương thức

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class InvokeClassMethod {
	void display() {
		// gọi hàm show
		this.show();

		System.out.println("Kết thúc hàm display");
	}

	void show() {
		System.out.println("Hàm show được gọi");
	}

	public static void main(String args[]) {
		InvokeClassMethod ahihi = new InvokeClassMethod();
		ahihi.display();
	}
}

Sử dụng làm đối số của hàm xây dựng

Tính năng này trong thực tế rất hữu ích, nhất là với các hàm xây dựng được sử dụng nhiều lần.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ArgumentConstructor {

	int x = 100;

	// Hàm xây dựng tạo ra đối tượng A
	// sau đó chuyển nó thành đối số trong hàm xây dựng
	ArgumentConstructor() {
		Ahihi obj = new Ahihi(this);
	}

	// phương thức hiện thị giá trị của x
	void display() {
		System.out.println("Giá trị của x trong lớp B là: " + x);
	}

	public static void main(String[] args) {
		ArgumentConstructor obj = new ArgumentConstructor();
	}

	class Ahihi {
		ArgumentConstructor obj;

		// Phương thức khởi tạo tham số với dối tượng B
		Ahihi(ArgumentConstructor obj) {
			this.obj = obj;

			// gọi phương thức display của lớp B
			obj.display();
		}

	}
}

Lời kết

This trong Java là một trong những từ khoá quan trọng, vừa giúp bạn tối ưu được code, vừa hỗ trợ xây dựng các phương án giải quyết vấn đề một các nhanh – gọn – lẹ.

Nếu bạn đam mê và theo đuổi để trở thành một lập trình viên Java thì chắc chắn luôn là bạn còn làm việc với this dài dài. Bởi Java làm việc hầu hết dựa trên lớp và các đối tượng mà this chính là cầu nối quan trọng để liên kết các thành phần bên trên lại với nhau. Nếu bạn chưa hiểu và dùng được this thì chưa thể làm Java developer được đâu.

Bài viết mang tính chất “ghi chú, lưu trữ, chia sẻ và phi lợi nhuận”.
Nếu bạn thấy hữu ích, đừng quên chia sẻ với bạn bè và đồng nghiệp của mình nhé!

Happy coding! 😎 👍🏻 🚀 🔥

This post is licensed under CC BY 4.0 by the author.