Bài đăng nổi bật

Từ khóa super đại diện cho lớp cha và có thể sử dụng để gọi tới phương thức cũng như phương thức khởi tạo của lớp cha.
Hãy bắt đầu bằng những câu hỏi: Một lớp con kế thừa những trường dữ liệu truy xuất được cũng như các phương thức của lớp cha của nó. Vậy liệu lớp con có kế thừa phương thức khởi tạo của lớp cha của nó hay không? Liệu phương thức khởi tạo của lớp cha có thể được gọi từ trong lớp con của nó hay không?
Bài viết này trả lời những thắc mắc đó cũng như các vấn đề kéo theo.
Ta hãy nhớ lại rằng, từ khóa this tham chiếu tới bản thân đối tượng, và khi được dùng trong một phương thức khởi tạo, nó gọi tới phương thức khởi tạo của cùng một lớp. Tương tự như thế, từ khóa super tham chiếu tới lớp cha của class mà từ khóa super xuất hiện. Và nó được sử dụng theo hai cách:
  • Để gọi tới phương thức khởi tạo ở lớp cha.
  • Để gọi tới phương thức ở lớp cha.

Gọi phương thức khởi tạo của lớp cha

Một phương thức khởi tạo được sử dụng để xây dựng nên một thực thể của một lớp (một đối tượng của lớp đối tượng đó). Không giống như thuộc tính và phương thức, phương thức khởi tạo không được thừa kế. Chúng chỉ có thể được truy cập từ trong phương thức khởi tạo của lớp con bằng từ khóa super.
Cú pháp là super() hoặc super(parameters).
Câu lệnh super() gọi tới phương thức khởi tạo không có tham số của lớp cha, và câu lệnh super(arguments) gọi tới phương thức khởi tạo của lớp cha mà có bộ các parameter tương xứng với bộ các argument. Cả hai lệnh trên đều cần phải là dòng lệnh đầu tiên trong phương thức khởi tạo, và đó là cách duy nhất để gọi tường minh phương thức khởi tạo của lớp cha. Ví dụ, phương thức khởi tạo của lớp Circle trong bài đọc trước có thể được viết lại như sau:
public Circle(double radius, String color, String filled) {
    super(color, filled);
    this.radius = radius;
}

Chuỗi phương thức khởi tạo

Lỗi thực thi có thể xảy ra nếu thực thể của lớp được tạo ra mà không có một phương thức khởi tạo nào của lớp cha được thực thi (một số thuộc tính có thể sẽ không được cài đặt đúng đắn chẳng hạn). Bởi vậy mà Java có cơ chế gọi ngầm định phương thức khởi tạo của lớp cha như là câu lệnh đầu tiên trong phương thức khởi tạo. Nói cách khác, những khối mã sau hoàn toàn tương đương nhau:

và:

Trong bất kỳ trường hợp nào, quá trình dựng nên một thực thể của bất kỳ lớp đối tượng nào sẽ gọi tới phương thức khởi tạo của tất cả các lớp cha theo dây chuyền thừa kế. Khi dựng đối tượng của lớp con, phương thức khởi tạo của lớp con đầu tiên sẽ gọi thực thi phương thức khởi tạo của lớp cha của nó trước khi thực thi những lệnh của riêng nó. Nếu lớp cha được kế thừa từ một lớp khác nữa, hành động trên sẽ được gọi đệ quy cho tới khi phương thức khởi tạo cuối cùng trong chuỗi thừa kế đã được gọi thực thi. Quy tắc thực thi này được gọi là “chuỗi khởi tạo”.
Trong hàm main của class Faculty dưới đây, chúng ta cố dựng một thực thể của class đó, hãy xem chuỗi phương thức khởi tạo đã được gọi thực thi như thế nào:
class Faculty extends Employee {
    public Faculty() {
        System.out.println("Faculty performing its tasks");
    }

    public static void main(String[] args) {
        new Faculty();
    }
}

class Employee extends Person {
    public Employee() {
        this("Employee overloading its tasks");
        System.out.println("Employee performing its tasks!");
    }

    public Employee(String s) {
        System.out.println(s);
    }
}

class Person {
    public Person() {
        System.out.println("Person performing its tasks!");
    }
}
Kết quả:
Person performing its tasks!
Employee overloading its tasks
Employee performing its tasks!
Faculty performing its tasks
Đầu ra cho thấy đối tượng được dựng từ những lớp ở rất xa trong chuỗi kế thừa. Tại sao lại vậy? Hãy theo dấu mũi tên trong lưu đồ sau đây:



CodeLean.vn

Facebook: CodeLean Community

Post a Comment

أحدث أقدم