[Java] Từ khóa this trong Java
Từ khóa this trong Java
Từ khóa this trong java
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.
Từ khóa this có 6 cách sử dụng sau:
-
Tham chiếu tới biến instance của lớp hiện tại.
-
Gọi phương thức (method) của lớp hiện tại.
-
Gọi hàm dựng (constructor) của lớp hiện tại.
-
Trả về instance của lớp hiện tại
-
Được truyền như một tham số trong phương thức (method).
-
Được truyền như một tham số trong hàm dựng (constructor).
1. Tham chiếu tới biến 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.
Ví dụ:
public class UsingThisExample {
private int id;
private String website;
private String subject;
public UsingThisExample(String website, String subject) {
website = website;
subject = subject;
}
public void print() {
System.out.println("Id = " + id);
this.printWebsite();
this.printSubject();
}
private void printWebsite() {
System.out.println("Subject = " + subject);
}
private void printSubject() {
System.out.println("Website = " + website);
}
public static void main(String[] args) {
UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
ex1.print();
}
}
Kết quả:
Id = 0
Subject = null
Website = null
Như chúng ta thấy, gía trị của biến được gán trong hàm construct không có tác dụng, do tên thuộc tính và tên biến giống nhau.
Để giải quyết vấn đề này ta sử dụng từ khóa this như ví dụ sau:
public class UsingThisExample {
private int id;
private String website;
private String subject;
public UsingThisExample(String website, String subject) {
this.website = website;
this.subject = subject;
}
public void print() {
System.out.println("Id = " + id);
this.printWebsite();
this.printSubject();
}
private void printWebsite() {
System.out.println("Subject = " + subject);
}
private void printSubject() {
System.out.println("Website = " + website);
}
public static void main(String[] args) {
UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
ex1.print();
}
}
Kết quả:
Id = 0
Subject = OOP
Website = gpcoder.com
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. Tuy nhiên, nên sử dụng từ khóa this để chương trình được rõ ràng và dễ hiểu.
Ví dụ:
Persion.java
package com.gpcoder.oop;
public class Person {
public void print() {
System.out.println("This is parent class");
}
}
Student.java
package com.gpcoder.oop;
public class Student extends Person {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public void print() {
System.out.println("id = " + id + ", name = " + name);
}
public void printChild1() {
this.print();
}
public void printChild2() {
super.print();
}
public static void main(String args[]) {
Student student = new Student(1, "gpcoder");
student.print();
System.out.println("---");
student.printChild1();
System.out.println("---");
student.printChild2();
}
}
Kết quả:
d = 1, name = gpcoder
---
id = 1, name = gpcoder
---
This is parent class
Như ví dụ trên, rõ ràng là trong trường hợp mà chương trình của bạn có nhiều class, các class có sử dụng kế thừa thì việc để từ khóa this sẽ giúp chương trình của bạn rõ ràng hơnc hạn chế sai sót do không xác định được đang gọi phương thức ở lớp cha hay lớp hiện tại.
2. Gọi phương thức của lớp hiện tại
Chúng ta 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 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.
Ví dụ:
public class UsingThisExample {
private int id;
private String website;
private String subject;
public UsingThisExample(String website, String subject) {
this.website = website;
this.subject = subject;
}
public void print() {
System.out.println("Id = " + id);
this.printWebsite();
printSubject();
}
private void printWebsite() {
System.out.println("Subject = " + subject);
}
private void printSubject() {
System.out.println("Website = " + website);
}
public static void main(String[] args) {
UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
ex1.print();
}
}
Kết quả:
Id = 0
Subject = OOP
Website = gpcoder.com
Như ví dụ trên, từ khóa this được sử dụng để gọi phương thức this.printWebsite(). Phương thức printSubject() trình biên dịch sẽ tự động thêm từ khóa this cho việc gọi phương thức.
3. 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.
Phương thức this() phải được khai báo dòng lệnh đầu tiên trong constructor.
Ví dụ:
package com.gpcoder.oop;
public class UsingThisExample {
private int id;
private String website;
private String subject;
public UsingThisExample() {
this.id = 1;
this.website = "https://gpcoder.com";
}
public UsingThisExample(String website ) {
this(); // Bắt buộc phải dòng lệnh đầu tiên trong constructor
this.website = website ;
}
public UsingThisExample(String website, String subject) {
this(website); // Bắt buộc phải dòng lệnh đầu tiên trong constructor
this.subject = subject;
}
public void print() {
System.out.println("Id = " + id);
this.printWebsite();
this.printSubject();
}
private void printWebsite() {
System.out.println("Subject = " + subject);
}
private void printSubject() {
System.out.println("Website = " + website);
}
public static void main(String[] args) {
UsingThisExample ex1 = new UsingThisExample("gpcoder.com", "OOP");
ex1.print();
}
}
Kết quả:
Id = 1
Subject = OOP
Website = gpcoder.com
4. 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à class của lớp hiện tại.
Ví dụ:
public class UsingThisExample {
private int id;
private String website;
private String subject;
public UsingThisExample() {
this.id = 1;
}
public UsingThisExample setWebsite(String website) {
this.website = website;
return this;
}
public UsingThisExample setSubject(String subject) {
this.subject = subject;
return this;
}
public void print() {
System.out.println("Id = " + id);
this.printWebsite();
this.printSubject();
}
private void printWebsite() {
System.out.println("Subject = " + subject);
}
private void printSubject() {
System.out.println("Website = " + website);
}
public static void main(String[] args) {
UsingThisExample ex1 = new UsingThisExample()
.setSubject("OOP")
.setWebsite("gpcoder.com");
ex1.print();
}
}
Kết quả:
Id = 1
Subject = OOP
Website = gpcoder.com
Như ví dụ trên, phương thức setWebsite và setSubject trả về tham chiếu tới biến instance của lớp hiện tại.
5. Được truyền như một tham số trong phương thức (method)
Từ khóa this có thể được dùng như một tham số trong phương thức (method). Cách dùng này chủ yếu được sử dụng trong sử lý sự kiện.
Ví dụ:
Helper.java
public class Helper {
public void print(UsingThisExample ex) {
System.out.println("Id = " + ex.getId());
System.out.println("Website = " + ex.getWebsite());
}
}
UsingThisExample.java
public class UsingThisExample {
private int id;
private String website;
UsingThisExample () {
this.id = 1;
this.website = "gpcoder";
}
public void print() {
Helper helper = new Helper();
helper.print(this);
}
public int getId() {
return id;
}
public String getWebsite() {
return website;
}
public static void main(String[] args) {
UsingThisExample ex = new UsingThisExample();
ex.print();
}
}
Kết quả:
Id = 1
Website = gpcoder
Như ví dụ trên, phương thức print của lớp UsingThisExample truyền tham số là this (tham chiếu biến instance của lớp UsingThisExample) sang cho phương thức print của lớp Helper xử lý.
6. Được truyền như một tham số trong hàm dựng (constructor)
Từ khóa this có thể được dùng như một tham số trong constructor. Cách dùng này rất hữu ích nếu chúng ta sử dụng một đối tượng trong nhiều lớp.
Ví dụ:
Helper.java
public class Helper {
private UsingThisExample ex;
public Helper(UsingThisExample ex) {
this.ex = ex;
}
public void printId() {
System.out.println("Id = " + ex.getId());
}
public void printWebsite() {
System.out.println("Website = " + ex.getWebsite());
}
}
UsingThisExample.java
public class UsingThisExample {
private int id;
private String website;
UsingThisExample () {
this.id = 1;
this.website = "gpcoder";
}
public void print() {
Helper helper = new Helper(this);
helper.printId();
helper.printWebsite();
}
public int getId() {
return id;
}
public String getWebsite() {
return website;
}
public static void main(String[] args) {
UsingThisExample ex = new UsingThisExample();
ex.print();
}
}
Kết quả:
Id = 1
Website = gpcoder
Như ví dụ trên, phương thức print gọi hàm khởi tạo của lớp Helper với tham số là this (tham chiếu biến instance của lớp UsingThisExample), sau đó gọi hàm printId và printWebsite để xử lý. Cách này hữu ích khi cần tái sử dụng object ở nhiều phương thức khác nhau, trong ví dụ này là printId và printWebsite.
Cảm ơn các bạn đã đọc bài viết. Chào thân ái và quyết thắng!
Link bài viết gốc: https://gpcoder.com/2260-tu-khoa-va-super-trong-java/
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!