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.
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
brandcủ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
- Một trường riêng tư lưu
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ứcgetInfo()của lớp cha bằngsuper.getInfo()và mở rộng kết quả để trả về:[parent info], Capacity: [capacity]kg
- Một trường riêng tư lưu
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ọigetInfo()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
}
}
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