Daily Archives: 09/08/2017

Java 8 – Từ khóa super

Nếu các phương thức của chúng ta ghi đè lên các phương thức của lớp cha, chúng ta có thể gọi lại chính các phương thức đã bị ghi đè đó ở lớp cha thông qua từ khóa super. Ngoài ra chúng ta cũng có thể tham chiếu trực tiếp tới các thuộc tính bị che giấu. Ví dụ:

public class Superclass {
    public void print() {
        System.out.println("Printed in Superclass.");
    }
}

Đoạn code trên định nghĩa lớp Superclass có một phương thức print(). Tiếp theo chúng ta định nghĩa lớp con như sau:

public class Subclass extends Superclass {

    @Override
    public void print() {
        super.print();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}

Chúng ta định nghĩa lớp Subclass kế thừa lớp Superclass, chúng ta cũng định nghĩa phương thức print() ghi đè phương thức print() của lớp Superclass. Tuy nhiên chúng ta vẫn có thể gọi tới phương thức print() của lớp Superclass từ lớp Subclass thông qua từ khóa super.

Printed in Superclass.
Printed in Subclass

Gọi phương thức khởi tạo

Chúng ta cũng có thể gọi lại phương thức khởi tạo của lớp cha bằng cách dùng từ khóa super. Giả sử chúng ta có lớp Blog với phương thức khởi tạo như sau:

public class Blog {
    private String title;
    public Blog(String title) {
        this.title = title;
    }
}

Phương thức khởi tạo của lớp Blog nhận vào một biến String. Tiếp theo chúng ta định nghĩa lớp PhoCodeBlog kế thừa từ lớp Blog như sau:

public class PhoCodeBlog extends Blog {
    private DateTime createdAt;
    public PhoCodeBlog(DateTime createdAt, String title) {
        super(title);
        this.createdAt = createdAt;   
    }
}

Phương thức khởi tạo của lớp PhoCodeBlog cũng nhận vào một đối tượng String, ngoài ra còn có một dối tượng DateTime dành riêng cho lớp này. Bên trong chúng ta gọi tới phương thức khởi tạo của lớp cha là Blog bằng cách gọi super() và truyền vào tham số là giá trị của đối tượng String title.

Lưu ý là nếu chúng ta có gọi tới phương thức super() thì luôn luôn đặt super() làm dòng đầu tiên.

Một lưu ý khác là bản thân các lớp sẽ có một phương thức khởi tạo không có tham số nếu chúng ta không khai báo phương thức khởi tạo nào. Nếu trong lớp con chúng ta không gọi tới các phương thức super() thì trình biên dịch sẽ tự động gọi tới phương thức super() không có tham số ở lớp cha, và do đó ở lớp cha phải có định nghĩa một phương thức khởi tạo không có tham số, nếu không trình biên dịch sẽ báo lỗi.

Và tất nhiên là điều đó có nghĩa là trình biên dịch sẽ lần lượt gọi ngược lại các phương thức khởi tạo của các lớp cha, dần dần quay về lớp gốc là lớp Object, trong Java thì quy trình này còn được gọi là chuỗi khởi tạo (constructor chaining).