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:
Đăng nhận xét