Lập trình Java cơ bản

Bài 16: Từ khóa super và this trong Java

1. Từ khóa super

Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất. Bất cứ khi nào bạn tạo ra instance (thể hiện) của lớp con, một instance của lớp cha được tạo ra ngầm định, nghĩa là được tham chiếu bởi biến super.Từ khóa super có 3 cách sử dụng sau:
  1. Gọi trực tiếp hàm dựng (constructor) của lớp cha gần nhất.
  2. Gọi trực tiếp thuộc tính (field) của lớp cha gần nhất.
  3. Gọi trực tiếp phương thức (method) của lớp cha gần nhất.
Ví dụ 1: Gọi trực tiếp constructor của lớp cha gần nhất
public class People{

    public People() {
        System.out.println("This is people");
        print();
    }

}
public class Employee extends People{

    public Employee() {
        System.out.println("This is employee");
    }

}
public class Main {

    public static void main(String args[]) {
        Employee e = new Employee();
    }

}
Kết quả thu đươc:
This is people
This is employee
Ví dụ 2: Gọi trực tiếp thuộc tính (field) của lớp cha gần nhất
package com.company;

public class People{
    String name = "Huy Nguyen";
}
package com.company;

public class Employee extends People {
    void printName(){
        System.out.println(super.name);
    }
}
package com.company;

public class Main {

    public static void main(String args[]) {
        Employee e = new Employee();
        e.printName();
    }

}
Kết quả thu được:
Huy Nguyen
Ở trường hợp thứ 3, cũng tương tự như trường hợp thứ 2, ta sẽ gọi phương thức của lớp cha gần nhất thông qua từ khóa super.

2. Từ khóa this

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:
  1. Tham chiếu tới biến instance của lớp hiện tại.
  2. Gọi phương thức (method) của lớp hiện tại.
  3. Gọi hàm dựng (constructor) của lớp hiện tại.
  4. Trả về instance của lớp hiện tại
  5. Được truyền như một tham số trong phương thức (method).
  6. Được truyền như một tham số trong hàm dựng (constructor).
Ví dụ 1: Tham chiếu tới biến instance của lớp hiện tại
public class Student {
    int id;
    String name;
 
    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    void display() {
        System.out.println(id + " " + name);
    }
 
    public static void main(String args[]) {
        Student s1 = new Student(1, "Huy");
        Student s2 = new Student(2, "Nguyen");
        s1.display();
        s2.display();
    }
}
Kết quả thu được:
Huy
Nguyen
Ví dụ 2: Gọi phương thức của lớp hiện tại
public class Example{
    void print() {
        System.out.println("Example");
   }
 
    public static void main(String args[]) {
       this.print();
    }

}
Kết quả thu được:
Example
Nếu trong trường hợp không sử dụng từ khóa this, trình biên dịch sẽ tự động thêm từ khóa this khi biên dịch.
Ví dụ 3: Gọi hàm dựng 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.
public class Employee {
    int id;
    String name;
 
    Employee() {
        System.out.println("Constructor mặc định");
    }
 
    Employee(int id, String name) {
        this(); // 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[]) {
        Employee e1 = new Employee(1, "Huy");
        Employee e2 = new Employee(2, "Nguyen");
        e1.display();
        e2.display();
    }
}
Constructor mặc định
Constructor mặc định
1 Huy
2 Nguyen
Ví dụ 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à kiểu class (không là kiểu nguyên thủy).
package com.company;

class Example{
    void getID(){
        System.out.println(this);
    }
}
public class Main {

    public static void main(String args[]) {
        Example e = new Example();
        e.getID();
    }
}
com.company.Example@6acbcfc0
Ví dụ 5: Được truyền như một tham số trong 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.
package com.company;

class Example{
    void getID(Example example){
        System.out.println("Example");
    }
    void print(){
        getID(this);
    }
}
public class Main {

    public static void main(String args[]) {
        Example e = new Example();
        e.print();
    }
}
Example
Ví dụ 6: Được truyền như một tham số trong hàm dựng
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.
package com.company;

class Example{
    Example2 obj;
    Example(Example2 obj) {
        this.obj=obj;
    }
    void display() {
        System.out.println(obj.number);// sử dụng biến thành viên cửa lớp A4
    }
}

class Example2 {
    String number = "Example";

    Example2() {
        Example b = new Example(this);
        b.display();
    }
}
public class Main {

    public static void main(String args[]) {
        Example2 e = new Example2();
    }
}
Example

Danh sách bài học