Menu
CoddyTech

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.

challenge icon

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 brand củ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
  • 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!
  • 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

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()
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Java online