Chuyển đến nội dung chính
Mô-đun 3 · Bài học 1 trong tổng số 25/14 trong khóa học~12 min
Bài học theo mô-đun (1/2)

Kế thừa

Kế thừa là một cơ chế cơ bản của OOP cho phép một lớp (được gọi là lớp con hoặc lớp con) kế thừa các trường và phương thức từ một lớp khác (được gọi là lớp cha hoặc lớp cha).

Điều này thúc đẩy việc tái sử dụng mã và tránh sự lặp lại không cần thiết.

Mở rộng một lớp học với extends

Trong Java, chúng tôi sử dụng từ khóa extends để chỉ ra rằng một lớp kế thừa từ một lớp khác:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

Hàm tạo và từ khóa super()

Nếu siêu lớp có một hàm tạo chấp nhận các tham số thì lớp con phải gọi nó một cách rõ ràng trong hàm tạo của nó bằng cách sử dụng super(...) làm câu lệnh đầu tiên:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

Ghi đè phương thức (@Override)

Một lớp con có thể cung cấp cách triển khai cụ thể của riêng nó cho một phương thức được kế thừa từ lớp cha. Thao tác này được gọi là ghi đè (ghi đè phương thức) và được biểu thị bằng chú thích @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

Công cụ sửa đổi protected

Công cụ sửa đổi quyền truy cập protected đóng vai trò chính trong tính kế thừa. Không giống như private, chỉ hiển thị các thành viên trong cùng một lớp, protected cho phép truy cập vào các trường và phương thức trong cùng một gói và bởi tất cả các lớp con, ngay cả khi chúng nằm trong các gói khác nhau.

Truy cập Thành viên gốc bằng super

Ngoài việc gọi hàm tạo của lớp cha, từ khóa super có thể được sử dụng trong các phương thức của lớp con để tham chiếu các phương thức hoặc biến của lớp cha. Điều này đặc biệt hữu ích khi một phương thức bị ghi đè, nhưng bạn vẫn muốn gọi hành vi gốc ban đầu:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Kế thừa đơn trong Java

Trong Java, một lớp có thể mở rộng chỉ một lớp (kế thừa đơn). Không được phép kế thừa trực tiếp từ nhiều lớp (đa kế thừa); ví dụ: class Cat extends Animal, Mammal sẽ gây ra lỗi biên dịch. Lựa chọn thiết kế này tránh được sự mơ hồ được gọi là "vấn đề kim cương" (khi hai siêu lớp định nghĩa cùng một phương thức nhưng cách triển khai khác nhau). Để khắc phục hạn chế này, Java giới thiệu khái niệm Giao diện mà chúng ta sẽ khám phá trong mô-đun tiếp theo.


Hãy tự mình thử

tập thể dục#java.m3.l1.e1
Nỗ lực: 0Đang tải…

Hoàn thành lớp con Dog bằng cách mở rộng Animal. Khai báo hàm tạo Dog chấp nhận tên (Chuỗi) và sử dụng super(name) để chuyển nó đến hàm tạo Animal.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Viết `public Dog(String name) { super(name); }` bên trong lớp Dog.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#java.m3.l1.e2
Nỗ lực: 0Đang tải…

Mở rộng Dog từ Animal và ghi đè phương thức makeSound() để nó trả về chuỗi Woof thay vì Generic Sound. Sử dụng chú thích @Override.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Viết `@Override` phía trên phần khai báo `public String makeSound() { return 'Woof'; }` bên trong Dog.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#java.m3.l1.e3
Nỗ lực: 0Đang tải…

Khai báo một lớp Cat mở rộng Animal và ghi đè phương thức makeSound() để trả về chuỗi Meow. Lớp Animal đã có sẵn một hàm tạo chấp nhận tên; đảm bảo rằng hàm tạo Cat cũng chấp nhận một tên và chuyển nó một cách chính xác cho hàm tạo siêu lớp.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Tạo lớp `Cat` mở rộng `Animal`. Khai báo hàm tạo `public Cat(String name) { super(name); }` và ghi đè phương thức `makeSound()` bằng cách sử dụng `@Override` để trả về `'Meow'`.

Giải pháp khả dụng sau 3 lần thử