Java - Thừa Kế: Hướng Dẫn Cho Người Mới Bắt Đầu

Xin chào các con nhà hóa Java tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới của thừa kế Java. Đừng lo nếu bạn mới bắt đầu học lập trình – tôi sẽ là người hướng dẫn bạn, giải thích mọi thứ từng bước. Vậy, hãy lấy ly cà phê (hoặc trà, nếu bạn thích) và cùng nhau nhảy vào!

Java - Inheritance

Thừa Kế Là Gì?

Hãy tưởng tượng bạn đang tạo một cây gia phả. Bạn có thể nhận ra rằng con cái kế thừa một số đặc điểm từ cha mẹ – có lẽ đôi mắt của cha bạn hoặc nụ cười của mẹ bạn. Thế nhưng, thừa kế trong Java hoạt động tương tự, nhưng với các lớp thay vì các thành viên trong gia đình!

Thừa kế là khái niệm cơ bản trong Lập Trình Hướng Đối Tượng (OOP) cho phép một lớp mới dựa trên một lớp hiện có. Lớp mới kế thừa các trường và phương thức từ lớp hiện có.

Tại Sao Chúng Ta Cần Thừa Kế?

  1. Tái Sử Dụng Mã: Thay vì viết mã giống nhau lại và lại, chúng ta có thể tái sử dụng mã hiện có.
  2. Tổ Chức Tốt Hơn: Giúp tạo ra một hệ thống lớp phân cấp rõ ràng và logic.
  3. Ghi Đè Phương Thức: Chúng ta có thể sửa đổi hành vi của các phương thức kế thừa.

Hãy xem một ví dụ đơn giản để hiểu rõ hơn.

Thực Hiện Thừa Kế Java

Trong Java, chúng ta sử dụng từ khóa extends để thực hiện thừa kế. Dưới đây là cấu trúc cơ bản:

class LopCha {
// Các thành viên của lớp cha
}

class LopCon extends LopCha {
// Các thành viên của lớp con
}

Bây giờ, hãy xem một ví dụ cụ thể hơn:

class DongVat {
void an() {
System.out.println("Con vật này ăn thực phẩm");
}
}

class Cho extends DongVat {
void keu() {
System.out.println("Con chó kêu");
}
}

public class VDThuaKe {
public static void main(String[] args) {
Cho myCho = new Cho();
myCho.an();  // Kế thừa từ DongVat
myCho.keu(); // Định nghĩa trong Cho
}
}

Trong ví dụ này, Cho kế thừa phương thức an() từ DongVat. Khi chạy chương trình này, chúng ta sẽ thấy:

Con vật này ăn thực phẩm
Con chó kêu

Đúng không? Lớp Cho của chúng ta giờ có cả phương thức an() từ DongVat và phương thức riêng keu()!

Từ Khóa 'super'

Bây giờ, giả sử chúng ta muốn tham chiếu đến lớp cha từ trong lớp con? Đó là nơi từ khóa super có ích. Nó như gọi điện thoại với cha mẹ khi bạn cần sự giúp đỡ của họ!

Hãy sửa đổi ví dụ của chúng ta:

class DongVat {
void an() {
System.out.println("Con vật này ăn thực phẩm");
}
}

class Cho extends DongVat {
void an() {
super.an();  // Gọi phương thức an() của DongVat
System.out.println("Con chó ăn thức ăn chó");
}
}

public class VDSuper {
public static void main(String[] args) {
Cho myCho = new Cho();
myCho.an();
}
}

Khi chạy điều này, chúng ta sẽ thấy:

Con vật này ăn thực phẩm
Con chó ăn thức ăn chó

Từ khóa super cho phép chúng ta gọi phương thức an() từ lớp DongVat trước khi thêm hành vi của riêng mình.

Gọi Công Khai Của Lớp Cha

Từ khóa super cũng có thể được sử dụng để gọi công khai của lớp cha. Điều này rất hữu ích khi bạn muốn khởi tạo các trường kế thừa.

class DongVat {
String ten;

DongVat(String ten) {
this.ten = ten;
}
}

class Cho extends DongVat {
String loai;

Cho(String ten, String loai) {
super(ten);  // Gọi công khai của DongVat
this.loai = loai;
}

void hienThi() {
System.out.println("Tên của tôi là " + ten + " và tôi là một " + loai);
}
}

public class VDCongKhai {
public static void main(String[] args) {
Cho myCho = new Cho("Buddy", "Golden Retriever");
myCho.hienThi();
}
}

Điều này sẽ đầu ra:

Tên của tôi là Buddy và tôi là một Golden Retriever

Mối Quan Hệ "IS-A"

Thừa kế thiết lập một mối quan hệ "IS-A" giữa các lớp. Trong các ví dụ của chúng ta, chúng ta có thể nói "Một Con Chó LÀ Một Động Vật". Mối quan hệ này là cơ bản để hiểu rõ thừa kế.

Từ Khóa 'instanceof'

Java cung cấp từ khóa instanceof để kiểm tra xem một đối tượng có phải là một thể hiện của một lớp hoặc giao diện cụ thể hay không. Nó như hỏi, "Hey, anh có phải là một phần của gia đình này không?"

public class VDInstanceof {
public static void main(String[] args) {
DongVat myDongVat = new DongVat();
Cho myCho = new Cho();

System.out.println(myDongVat instanceof DongVat); // true
System.out.println(myCho instanceof DongVat);    // true
System.out.println(myDongVat instanceof Cho);    // false
}
}

Mối Quan Hệ "HAS-A"

Trong khi thừa kế đại diện cho mối quan hệ "IS-A", phối hợp đại diện cho mối quan hệ "HAS-A". Ví dụ, Một Xe Có Một Động Cơ.

class DongCo {
void start() {
System.out.println("Động cơ đã khởi động");
}
}

class Xe {
private DongCo dongCo;

Xe() {
this.dongCo = new DongCo();
}

void startXe() {
dongCo.start();
System.out.println("Xe sẵn sàng đi!");
}
}

public class VDPhoiHop {
public static void main(String[] args) {
Xe myXe = new Xe();
myXe.startXe();
}
}

Các Loại Thừa Kế Java

Java hỗ trợ một số loại thừa kế:

  1. Thừa Kế Đơn: Một lớp kế thừa từ một lớp cha.
  2. Thừa Kế Đa Cấp: Một lớp kế thừa từ một lớp, đóng vai trò làm cha của một lớp khác.
  3. Thừa Kế Phân Cấp: Nhiều lớp kế thừa từ một lớp cha duy nhất.

Java không hỗ trợ thừa kế nhiều lớp (nơi một lớp kế thừa từ nhiều lớp) để tránh nhầm lẫn. Tuy nhiên, nó hỗ trợ thừa kế nhiều thông qua giao diện.

Dưới đây là bảng tóm tắt các loại thừa kế:

Loại Thừa Kế Mô Tả Được Hỗ Trợ Trong Java
Đơn Một lớp kế thừa từ một lớp cha
Đa Cấp Một lớp kế thừa từ một lớp, đóng vai trò làm cha của một lớp khác
Phân Cấp Nhiều lớp kế thừa từ một lớp cha duy nhất
Nhiều Một lớp kế thừa từ nhiều lớp Không (nhưng có thể với giao diện)

Và đó là những gì chúng ta đã nói, các bạn! Chúng ta đã bắt đầu với các khái niệm cơ bản về thừa kế Java. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo, vậy đừng ngần ngại thử nghiệm các khái niệm này. Chúc các bạn lập trình vui vẻ, và may mắn với thừa kế!

Credits: Image by storyset