Kế thừa cơ bản (extends)
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 20 trên 87.
Kế thừa là một trong những trụ cột cốt lõi của OOP. Kế thừa cho phép một lớp có các thuộc tính và phương thức của lớp khác, giúp tái sử dụng code và tạo nên hệ thống phân cấp tự nhiên giữa các lớp.
Trong Java, bạn tạo quan hệ kế thừa bằng từ khóa extends. Lớp kế thừa được gọi là lớp con, còn lớp mà lớp con kế thừa được gọi là lớp cha.
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Gọi hàm khởi tạo (constructor) của lớp cha
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Lớp Dog tự động kế thừa phương thức eat() và phương thức getName() từ Animal. Lớp này cũng có thể định nghĩa các phương thức riêng như bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Kế thừa: "Buddy is eating"
myDog.bark(); // Phương thức riêng: "Buddy says woof!"Hãy xem kế thừa là mối quan hệ «là một». Dog là một Animal, nên Dog kế thừa từ Animal là hợp lý. Mối quan hệ này giúp bạn xây dựng các lớp chuyên biệt dùng chung chức năng, đồng thời bổ sung hành vi riêng.
Thử thách
DễHãy xây dựng một hệ thống phương tiện đơn giản để minh họa cách hoạt động của tính kế thừa. Bạn sẽ tạo một lớp cha chứa các thuộc tính chung của phương tiện và một lớp con kế thừa lớp đó, bổ sung hành vi riêng.
Bạn sẽ sắp xếp code trong ba tệp:
Vehicle.java: Tạo lớp cha đại diện cho mọi phương tiện. Lớp này cần có:- Một trường private cho
brandcủa phương tiện (String) - Một hàm khởi tạo nhận tên hãng và gán tên đó cho trường. (Ở đây không cần gọi
super(), vì Vehicle nằm ở đầu hệ thống phân cấp.) - Một phương thức
getBrand()trả về tên hãng - Một phương thức
start()in ra:[brand] is starting
- Một trường private cho
Motorcycle.java: Tạo một lớp con kế thừa Vehicle. Xe máy là một loại phương tiện, vì vậy mối quan hệ «là một» này phù hợp với tính kế thừa. Lớp Motorcycle cần:- Dùng
extendsđể kế thừa từ Vehicle - Có một hàm khởi tạo nhận tên hãng và truyền tên đó cho lớp cha bằng
super(brand) - Thêm phương thức riêng
wheelie()để in ra:[brand] is doing a wheelie!
- Dùng
Main.java: Kết hợp mọi thứ bằng cách tạo một đối tượng Motorcycle và minh họa cả hành vi kế thừa lẫn hành vi riêng. Bạn sẽ nhận một đầu vào: tên hãng. In ra hai dòng bằng cách gọi:- Phương thức
start()được kế thừa - Phương thức
wheelie()riêng của Motorcycle
- Phương thức
Bạn sẽ nhận một đầu vào: tên hãng (String) của xe máy.
Lưu ý rằng Motorcycle tự động có thể dùng start() và getBrand() mà không cần viết lại chúng. Đó chính là sức mạnh của tính kế thừa!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Tạo đối tượng Motorcycle với brand
// TODO: Gọi phương thức start() kế thừa
// TODO: Gọi phương thức wheelie()
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online