Mục lục bài họcĐang ở d03-b3
Inheritance: extends, super, and Method Overriding
extends says is-a
public class Manager extends Employee declares that every Manager is an Employee. The subclass inherits all public methods of the superclass. It does not inherit constructors, and although every subclass object still carries the superclass private instance variables, it cannot touch them by name — it must go through the superclass accessors and mutators.
Constructors run outward-in
The first statement of every subclass constructor is a call to a superclass constructor. If you write super(...) explicitly, that one runs; if you write nothing, Java inserts super() with no arguments. So if the superclass has no no-argument constructor and you forget the explicit super(...), the code does not compile. Execution order is therefore superclass constructor first, then the subclass constructor body.
Overriding versus overloading
Overriding replaces an inherited method: same name, same parameter list, in a subclass. Overloading adds a new method: same name, different parameter list, usually in the same class. Change a parameter type by accident and you have overloaded rather than overridden — the superclass version still runs, and nothing warns you.
Inside an override, super.methodName(args) calls the superclass version, which is the standard way to say do everything the parent did, then add my part.
extends nghĩa là là một
public class Manager extends Employee tuyên bố mọi Manager là một Employee. Lớp con thừa hưởng toàn bộ phương thức public của lớp cha. Nó không thừa hưởng hàm khởi tạo; và tuy mỗi đối tượng con vẫn mang trong mình các biến private của cha, lớp con không gọi tên chúng trực tiếp được — phải đi qua accessor và mutator mà cha công khai.
Hàm khởi tạo chạy từ ngoài vào trong
Câu lệnh đầu tiên của mọi hàm khởi tạo lớp con là một lời gọi hàm khởi tạo lớp cha. Viết super(...) tường minh thì bản đó chạy; không viết gì thì Java tự chèn super() không tham số. Vì thế nếu lớp cha không có hàm khởi tạo không tham số mà bạn quên super(...) tường minh, code không biên dịch được. Thứ tự chạy do đó luôn là: thân hàm khởi tạo cha trước, thân hàm khởi tạo con sau.
Ghi đè khác nạp chồng
Ghi đè là thay thế một phương thức thừa hưởng: cùng tên, cùng danh sách tham số, nằm ở lớp con. Nạp chồng là thêm một phương thức mới: cùng tên, khác danh sách tham số. Lỡ đổi một kiểu tham số là bạn đã nạp chồng chứ không ghi đè — bản của lớp cha vẫn chạy và không có cảnh báo nào.
Bên trong một bản ghi đè, super.tenPhuongThuc(thamSo) gọi bản của lớp cha. Đó là cách chuẩn để nói làm hết những gì cha làm, rồi thêm phần của tôi.
System.out.print vào hai hàm khởi tạo rồi bắt đoán thứ tự — vẽ đúng hai mũi tên này là xong.Cho lớp Employee có tên và lương cơ bản, phương thức pay() trả lương. Viết lớp Manager kế thừa nó, có thêm số nhân viên quản lý, và pay() bằng lương cơ bản cộng 200000 cho mỗi nhân viên. Không được chép lại công thức lương của cha.
public class Employee {
private String name;
private int base;
public Employee(String name, int base) {
this.name = name;
this.base = base;
}
public int pay() {
return base;
}
public String getName() {
return name;
}
}
public class Manager extends Employee {
private int team;
public Manager(String name, int base, int team) {
super(name, base);
this.team = team;
}
public int pay() {
return super.pay() + 200000 * team;
}
}Bốn chỗ đáng chú ý:
super(name, base)là dòng đầu tiên của hàm khởi tạo con. Không có nó, Java chènsuper()màEmployeelại không có hàm khởi tạo rỗng nên hỏng ngay lúc biên dịch.Managerkhông viết đượcthis.base = base;vìbaselàprivatecủa cha. Con chỉ đi qua hàm khởi tạo hoặc accessor của cha.super.pay()gọi bản của cha. Viếtpay()trơn ở đây là tự gọi chính mình vô hạn lần cho tới khi tràn ngăn xếp.pay()ở con cùng tên, cùng danh sách tham số rỗng, cùng kiểu trả về — đúng định nghĩa ghi đè.
public void add(int n), lớp con gõ public void add(double n) — trình biên dịch coi đó là một phương thức mới (nạp chồng), bản của cha vẫn còn nguyên và vẫn là bản được gọi khi truyền số nguyên. Bài chạy ra kết quả cũ mà không hề báo lỗi. Cách chặn: khi ghi đè, chép nguyên xi dòng khai báo của cha rồi mới sửa thân hàm — đừng gõ lại từ trí nhớ. Bẫy anh em: gọi pay() thay vì super.pay() trong chính bản ghi đè pay(), tạo đệ quy vô hạn.extends = là một. Hàm khởi tạo không được thừa hưởng, và super(...) phải đứng dòng đầu. Cha chạy trước, con chạy sau. Cùng tên + cùng tham số = ghi đè; cùng tên + khác tham số = nạp chồng. Biến private của cha thì con phải mượn accessor mới đọc được.Đọc xong rồi — làm thử ngay
Bài tập của chương Unit 3 — Class Creation gồm 14 câu trắc nghiệm và 8 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.