Java: Thừa kế (Inheritant)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Giới thiệu

Giả sử có một sinh viên đang phát triển một website với mục đích đưa ra các thói quen ăn uống của các loài động vật khác nhau trên trái đất. Trong khi thiết kế và phát triển website này thì sinh viên nhận ra rằng có nhiều loài vật ăn cùng một loại thức ăn và có tập tính tương tự nhau. Các nhóm con của tất cả các loài vật mà ăn thực vật thì gọi là động vật ăn cỏ, còn động vật ăn động vật thì gọi là động vật ăn thịt, còn nhóm động vật ăn cả thực vật và thịt thì gọi là động vật ăn tạp. Những nhóm hay phân loại như vậy thì được gọi là phân lớp và những nhóm con được gọi là lớp con.

Mối quan hệ is-a của các thực thể trong thế giới thực

Sơ đồ trên thể hiện mối quan hệ giữa các loại đối tượng khác nhau. Ví dụ, Hươu là động vật ăn cỏ và động vật ăn cỏ là động vật. Những thuộc tính chung của tất cả các loài động vật ăn cỏ có thể được lưu trữ trong lớp động vật ăn cỏ. Tương tự như vậy, các thuộc tính chung của tất cả các loài động vật như động vật ăn cỏ, ăn thịt hay ăn tạp đều có thể lưu trữ trong lớp động vật.

Như vậy, lớp Động vật trở thành lớp đầu tiên so với các lớp khác, và các lớp động vật nhỏ hơn là Ăn cỏ, Ăn thịt, và Ăn tạp sẽ thừa kế các thuộc tính và hành vi từ lớp này. Rồi đến những lớp nhỏ hơn nữa như Hươu, Sư tử, Mèo cũng lại thừa kế các thuộc tính và phương thức từ những lớp nhỏ này.

Tương tự như vậy, Java cung cấp khái niệm Thừa kế (Inheritant) để cho phép tạo các lớp con của một lớp.

Đặc điểm và thuật ngữ

Trong Java, khi thực thi thừa kế, lớp được dẫn xuất từ lớp khác được gọi là phân lớp, lớp dẫn xuất, lớp con, hoặc lớp mở rộng. Lớp mà từ đó phân lớp được dẫn xuất thì được gọi là siêu lớp, lớp cơ sở, hoặc lớp cha.

Việc thực hiện thao tác thừa kế là đơn giản và hiệu quả, trong đó nó cho phép tạo một lớp mới từ một lớp có sẵn mà đã có mã lệnh và dữ liệu yêu cầu. Lớp mới dẫn xuất từ lớp có sẵn có thể tái sử dụng các biến và phương thức của nó mà không cần phải viết lại hoặc sửa lại đoạn mã.

Lớp con thừa kế tất cả các thành phần như là biến, lớp lồng, và những phương thức từ lớp cha của nó ngoại trừ những thành phần private. Tuy nhiên, các hàm tạo của một lớp không được coi là thành phần của nó và vì vậy chúng không được thừa kế bởi các lớp con. Tuy vậy, từ lớp con có thể gọi hàm tạo của lớp cha từ chính hàm tạo của nó.

Các thành phần có mức truy cập mặc định trong lớp cha không được thừa kế bởi lớp con của những gói khác. Những thành phần này chỉ có thể được truy cập bởi các lớp con trong cùng một gói với lớp cha. Lớp con sẽ có những đặc điểm đặc trưng của chính nó cùng với những gì được thừa kế từ lớp cha.

Có một số kiểu thừa kế được thể hiện ở hình dưới đây:

Các kiểu thừa kế trong Java

Dưới đây là những giải thích cụ thể cho các kiểu thừa kế khác nhau trong Java:

- Đơn thừa kế: Xảy ra khi một lớp con thừa kế từ chỉ một lớp cha. Ở hình trên, lớp B thừa kế từ một lớp đơn A là một ví dụ về đơn thừa kế.

- Thừa kế nhiều mức: Khi một lớp con dẫn xuất từ một lớp cha và bản thân lớp cha lại là con của một lớp khác thì được gọi là thừa kế nhiều mức. Lớp C ở hình trên thừa kế từ lớp B và lớp B lại thừa kế từ lớp A là thể hiện của kiểu thừa kế này.

- Thừa kế phân cấp: Loại thừa kế này xảy ra khi một lớp cha có nhiều hơn một lớp con ở những mức khác nhau. Ở hình trên, thể hiện của kiểu thừa kế này là lớp C thừa kế từ lớp B và lớp B cùng với lớp D thừa kế từ lớp A.

- Đa thừa kế: Xảy ra khi một lớp con dẫn xuất từ nhiều hơn một lớp cha. Java không hỗ trợ đa thừa kế. Điều này có nghĩa là, một lớp trong Java không thể thừa kế từ nhiều hơn một lớp cha. Tuy nhiên, Java cung cấp một cách giải quyết khác là cho phép một lớp thừa kế từ nhiều Interface (giao diện).

Làm việc với lớp cha và lớp con

Trong một lớp con, ta có quyền sử dụng các thành phần được thừa kế, ví dụ như ẩn chúng, thay thế chúng, hoặc tăng cường chúng. Ngoài ra, ta cũng có thể thực hiện những điều sau ở lớp con:

- Các thành phần được thừa kế từ lớp cha bao gồm các thuộc tính và phương thức, có thể được sử dụng trực tiếp như những thuộc tính và phương thức khác của lớp đó.

- Ta có thể khai báo một thuộc tính với tên giống với tên thuộc tính của lớp cha. Điều này sẽ dẫn đến ẩn đi thuộc tính của lớp cha, nhưng việc này không được khuyến khích.

- Ta có thể khai báo những thuộc tính mới của lớp con mà không có trong lớp cha.

- Ta có thể định nghĩa một phương thức mới giống hệt phương thức trong lớp cha. Điều này gọi là ghi đè phương thức.

- Một phương thức tĩnh mới có thể được tạo trong lớp con giống hệt với phương thức trong lớp cha. Điều này dẫn đến ẩn đi phương thức của lớp cha.

- Ta có thể định nghĩa những phương thức mới trong lớp con mà không có trong lớp cha.

- Một hàm tạo của lớp con có thể được sử dụng để gọi hàm tạo của lớp cha, có thể gọi ngầm định hoặc sử dụng từ khóa super.

Từ khóa extends được dùng khi tạo lớp con thừa kế từ lớp cha. Nếu một lớp không có bất kỳ lớp cha nào, thì ngầm định lớp cha của nó là lớp Object. Cú pháp để tạo một lớp con thừa kế là như sau:

class <tên_lớp_con> extends <tên_lớp_cha> {


}

Ví dụ sau tạo một lớp có tên Animal:

//tạo lớp Animal:
public class Animal {
  //khai báo các thuộc tính:
  int id; //mã nhận diện
  String name; //tên
  float age; //tuổi

  //hàm tạo không tham số
  public Animal() {
    id = 1234;
    name = "Moon";
    age = 1;
  }

  //hàm tạo 3 tham số
  public Animal(int id, String name, float age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  void inputInfo(){
    Scanner input=new Scanner(System.in);
    System.out.print("Input id: ");
    id=input.nextInt();
    System.out.print("Input name: ");
    input.nextLine();
    name=input.nextLine();
    System.out.print("Input age: ");
    age=input.nextFloat();
  }

  void showInfo() {
    System.out.println("ID: " + id);
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
  }
}

Còn đoạn mã dưới đây tạo một lớp có tên Cat thừa kế (hay dẫn xuất) từ lớp Animal ở trên:

class Cat extends Animal{
}

 

Khi này thì lớp Cat sẽ thừa hưởng các thuộc tính id, name, age, đồng thời cũng được thừa hưởng các phương thức inputInfo() và showInfo() của lớp Animal.

Dưới đây là đoạn code hoàn chỉnh, bạn có thể copy và chạy thử nhé:

import java.util.Scanner;

//tạo lớp Animal:
public class Animal {
  //khai báo các thuộc tính:
  int id; //mã nhận diện
  String name; //tên
  float age; //tuổi

  //hàm tạo không tham số, lớp con không thừa kế được hàm tạo
  public Animal() {
    id = 1234;
    name = "Moon";
    age = 1;
  }

  //hàm tạo 3 tham số, lớp con không thừa kế được hàm tạo
  public Animal(int id, String name, float age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  void inputInfo(){
    Scanner input=new Scanner(System.in);
    System.out.print("Input id: ");
    id=input.nextInt();
    System.out.print("Input name: ");
    input.nextLine();
    name=input.nextLine();
    System.out.print("Input age: ");
    age=input.nextFloat();
  }

  void showInfo() {
    System.out.println("ID: " + id);
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
  }
}

class Cat extends Animal{
}

class TestCat {
  public static void main(String[] args) {
    Cat cat = new Cat();
    //truy cập các thuộc tính của cat được thừa hưởng từ Animal:
    cat.id=1234;
    cat.name="Moon";
    cat.age=1.5f;
    //truy cập các phương thức của cat được thừa hường từ Animal:
    cat.showInfo();//hiển thị thông tin của cat
    cat.inputInfo();//nhập thông tin cho cat
    cat.showInfo();//hiển thị thông tin sau khi nhập (kiểm tra coi nhập được không)
  }
}

Kết quả:

ID: 1234
Name: Moon
Age: 1.5
Input id: 5678
Input name: Tam thể
Input age: 2
ID: 5678
Name: Tam thể
Age: 2.0

Xem thêm

» Tiếp: Ghi đè phương thức (Override)
« Trước: Từ khóa static
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!