Từ khoá super – Access Parent class

Từ khoá super được sử dụng để truy xuất đến các thuộc tính, method, etc của class cha. Trước khi đọc bài này, bạn phải chắc rằng mình đã biết đến thừa kế là gì để có thể hiểu được bài viết này.

Sử dụng từ khoá super

  1. Truy cập đến các biến instance của class cha. Sử dụng khi class cha và class con có các biến instance giống tên nhau. 
  2. Gọi constructor của class cha.
  3. Truy cập method của class cha khi class con đã ghi đè phương thức của class cha.

Sử dụng super để truy cập biến instance của class cha

Khi class con có biến cùng tên với một biến ở class cha. Trong trường hợp này nếu bạn muốn truy cập đến biến của class cha thì chúng ta sẽ dùng từ khoá super để giải quyết.

// File SuperClass.java
public class SuperClass {
    String name = "supper class";
}
// File SubClass.java
public class SubClass extends SuperClass {
    String name = "sub class";

    void display() {
        System.out.println(name);
        System.out.println(super.name);
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.display();
    }
}

Output:
sub class
supper class

Khi các bạn gọi name không có từ khoá super mặc định trình biên dịch sẽ hiểu là chúng ta đang muốn nói đến name của SubClass. 

Sử dụng super để gọi contructor của class cha

Gọi constructor class cha không có tham số

// File SuperClass.java
public class SuperClass {
    SuperClass() {
        System.out.println("Constructor super class");
    }
}
// File SubClass.java
public class SubClass extends SuperClass {
    SubClass() {
      
        System.out.println("Connstructor subclass");
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
    }
}

Output:

Constructor super class
Connstructor subclass

Note: Trình biên dịch sẽ tự động gọi constructor mặc định(không có tham số đầu vào) của class cha khi chúng ta không chỉ định super() ở class con, nếu class cha không có constructor mặc định thì trình biên dịch sẽ báo lỗi biên dịch.

Hoặc file Subclass.java ta thêm super() lên đầu cũng có kết quả tương tự.

// File Subclass.java
public class SubClass extends SuperClass {
    SubClass() {
        super();
        System.out.println("Connstructor subclass");
    }
}

Note: super() phải là mệnh đề được đặt đầu tiên trong constructor.

Gọi constructor class cha có tham số

// File SuperClass.java
public class SuperClass {
   SuperClass(String str) {
        System.out.println("Constructor has param: " + str);
    }
}
// File SubClass.java
public class SubClass extends SuperClass {
    SubClass() {
        super("Shareprogramming.net");
        System.out.println("Connstructor subclass");

    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
    }
}

Output: 

Constructor has param: Shareprogramming.net
Connstructor subclass

Để gọi constructor có tham số chúng ta phải thêm từ khoá super và truyền tham số cần thiết.

Sử dụng super để gọi method bị override bởi class con.

// SuperClass.java
public class SuperClass {
    void display() {
        System.out.println("Super class nek");
    }
}
// SubClass.java
public class SubClass extends SuperClass {

    void display() {
        System.out.println("Subclass nek");
    }

    void call() {
        // gọi method display của class con
        display();
        // gọi method display của class cha
        super.display();
    }
}
// Main.java
public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.call();
    }
}

Output:

Subclass nek
Super class nek

Cả class cha và class con đều chứa method display(), để phân biệt chúng ta muốn gọi method của class con hay class cha bắt buộc chúng ta phải dùng từ khoá super.

Note: Nếu một method của class cha mà không có method nào của class con trùng tên thì chúng ta không cần dùng đến từ khoá super

ví dụ

Đổi tên method display() của class cha thành superDisplay()

//Fule SuperClass.java
public class SuperClass {
    void superDisplay() {
        System.out.println("Super class nek");
    }
}

Vậy ở method con call() của class con chúng ta chỉ cần gọi superDisplay() mà không cần đến super.

// File SubClass.java
public class SubClass extends SuperClass {

    void display() {
        System.out.println("Subclass nek");
    }
    void call() {
        display();
        superDisplay();
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.call();
    }
}

Hàm main giữ nguyên và chúng ta được output

Subclass nek
Super class nek

Nguồn tham khảo

https://www.geeksforgeeks.org/super-keyword/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x