Menu
CoddyTech

Từ khóa super

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 21 trên 87.

Từ khóa super giúp lớp con tham chiếu đến lớp cha. Từ khóa này rất cần thiết khi bạn cần truy cập các thành viên hoặc hàm khởi tạo của lớp cha từ bên trong lớp con.

Cách dùng phổ biến nhất của super là gọi hàm khởi tạo của lớp cha. Đây phải là câu lệnh đầu tiên trong hàm khởi tạo của lớp con:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
    
    public String getBrand() {
        return brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // Phải là dòng đầu tiên
        this.doors = doors;
    }
}

Bạn cũng có thể dùng super để gọi các phương thức của lớp cha, điều này đặc biệt hữu ích khi lớp con có phương thức cùng tên:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // Gọi phiên bản của Animal
        System.out.println("Meow!");
    }
}

Hãy xem super như là điều ngược lại với this. Trong khi this tham chiếu đến đối tượng hiện tại, super tham chiếu đến phần lớp cha của đối tượng đó. Sự khác biệt này rất quan trọng khi xây dựng hệ phân cấp lớp, nơi các lớp con cần mở rộng thay vì thay thế hoàn toàn hành vi của lớp cha.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống thiết bị gia dụng để minh họa cách lớp con có thể dùng super để gọi hàm khởi tạo của lớp cha và mở rộng cách hoạt động của phương thức lớp cha.

Bạn sẽ tạo ba tệp để tổ chức code:

  • Appliance.java: Tạo lớp cha đại diện cho mọi thiết bị gia dụng. Lớp này cần có:
    • Một trường riêng tư lưu brand của thiết bị (String)
    • Một trường riêng tư lưu wattage (int)
    • Một hàm khởi tạo nhận cả hai giá trị và khởi tạo chúng
    • Một phương thức getBrand() trả về thương hiệu
    • Một phương thức getWattage() trả về công suất
    • Một phương thức getInfo() trả về: [brand] - [wattage]W
  • WashingMachine.java: Tạo một lớp con kế thừa từ Appliance. Máy giặt có mọi thứ mà thiết bị gia dụng có, cùng với các tính năng riêng:
    • Một trường riêng tư lưu capacity (int), biểu thị khối lượng giặt tính bằng kg
    • Một hàm khởi tạo nhận thương hiệu, công suất và sức chứa, dùng super(brand, wattage) để khởi tạo phần thuộc lớp cha, sau đó đặt sức chứa
    • Một phương thức getCapacity() trả về sức chứa
    • Một phương thức getInfo() gọi phương thức getInfo() của lớp cha bằng super.getInfo() và mở rộng kết quả để trả về: [parent info], Capacity: [capacity]kg
  • Main.java: Tạo một đối tượng WashingMachine và hiển thị đầy đủ thông tin của nó. Bạn sẽ nhận ba đầu vào: thương hiệu (String), công suất (int) và sức chứa (int). In ra kết quả khi gọi getInfo() trên máy giặt.

Bạn sẽ nhận ba đầu vào: tên thương hiệu, công suất và sức chứa.

Hãy chú ý cách super đảm nhiệm hai mục đích ở đây: gọi hàm khởi tạo của lớp cha để khởi tạo các trường được kế thừa, và gọi phương thức của lớp cha để phát triển thêm cách hoạt động của phương thức đó thay vì thay thế hoàn toàn.

Tự làm thử

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Đọc các giá trị đầu vào
        String brand = scanner.nextLine();
        int wattage = scanner.nextInt();
        int capacity = scanner.nextInt();
        
        // TODO: Tạo đối tượng WashingMachine bằng các giá trị đầu vào
        
        // TODO: In ra kết quả khi gọi getInfo() trên máy giặt
    }
}
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