Kế thừa IS-A trong JAVA

0
9645
Kế thừa IS-A trong JAVA

Kế thừa trong Java là một cơ chế trong đó một đối tượng kế thừa lại tất cả thuộc tính và hành vi của một đối tượng cha.

Hôm nay chúng ta sẽ tìm hiểu về loại kế thừa IS-A trong Java.

Kế thừa IS-A trong JAVA
Kế thừa IS-A trong JAVA

Nó là một phần quan trọng của OOPs (Hệ thống lập trình hướng đối tượng).

Ý tưởng đằng sau kế thừa trong Java là bạn có thể tạo ra các class mới được xây dựng dựa trên các class hiện có.

Khi bạn kế thừa từ một class hiện có, bạn có thể tái sử dụng phương thức và các trường của các class cha. Hơn nữa, bạn có thể thêm phương thức mới và trường vào class hiện tại.

Loại kế thừa này đại diện cho mối quan hệ IS-A. Được biết đến như là một mối quan hệ giữa Cha – con.

Tại sao sử dụng Kế thừa trong Java?

Sử dụng kế thừa trong Java để:

  • Method Overriding (ghi đè phương thức để có thể đạt được tính đa hình trong runtime).
  • Tái sử dụng code

Thuật ngữ được sử dụng trong kế thừa

  • Class: Một class là một nhóm các đối tượng có các thuộc tính chung. Nó là một mẫu hoặc bản thiết kế mà từ đó tạo ra các đối tượng cụ thể.
  • Sub Class / Child Class: Lớp con là lớp kế thừa lớp khác. Nó cũng được gọi là lớp dẫn xuất, lớp mở rộng hoặc lớp con.
  • Super Class / Parent Class: Superclass là lớp mà từ đó một lớp con kế thừa các tính năng của nó. Nó cũng được gọi là lớp cơ sở (Base Class) hoặc lớp cha (Parent Class).
  • Reusability: Như tên gọi của nó, khả năng tái sử dụng là một cơ chế tạo điều kiện cho bạn sử dụng lại các trường và phương thức của lớp hiện có khi bạn tạo một lớp mới. Bạn có thể sử dụng các trường và phương thức tương tự đã được định nghĩa trong lớp cha.

Cú pháp kế thừa trong Java

class Subclass-name extends Superclass-name  
{  
   // Code cái gì đấy
}  

Từ khóa extends chỉ ra rằng bạn đang tạo một lớp mới xuất phát từ một lớp hiện có. Ý nghĩa của ‘extends là mở rộng chức năng.

Theo thuật ngữ của Java, một class được kế thừa được gọi là Parentclass hoặc Superclass và class mới được gọi là Childclass hoặc Subclass.

Ví dụ về kế thừa trong Java

Như được hiển thị trong hình trên, Laptrinhvien là subclass và Nhanvien là Superclass. Mối quan hệ giữa hai lớp là Laptrinhvien IS-A Nhanvien. Nó có nghĩa là lập trình viên là một loại nhân viên.

class Nhanvien{  
  float luong = 800;
}  
class Laptrinhvien extends Nhanvien{  
  int thuong = 1000;

  public static void main(String args[]){  
    Laptrinhvien a = new Laptrinhvien();  
    System.out.println("Lương của lập trình viên là: "+a.luong);  
    System.out.println("Thưởng của lập trình viên là: "+a.thuong);  
  }  
}  

Kết quả:

Lương của lập trình viên là: 800.0
Thưởng của lập trình viên là: 1000

Trong ví dụ trên, đối tượng Laptrinhvien có thể truy cập vào trường riêng cũng như khả năng sử dụng lại mã của class Nhanvien.

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

Có thể có ba loại kế thừa class trong Java: Đơn, Đa cấp và Phân cấp.

Trong lập trình java, đa kế thừa và kế thừa lai chỉ được hỗ trợ thông qua interface. Chúng ta sẽ tìm hiểu về các interface sau.

Kế thừa class trong Java: Đơn, Đa cấp và Phân cấp
Kế thừa class trong Java: Đơn, Đa cấp và Phân cấp

Lưu ý: Đa kế thừa không được hỗ trợ thông qua class

Khi một class kế thừa nhiều class, nó được gọi là đa kế thừa. Ví dụ:

Đa kế thừa và Kế thừa lai trong Java
Đa kế thừa và Kế thừa lai trong Java

Ví dụ về kế thừa đơn

File: TestInheritance.java

class Animal{  
  void eat(){
    System.out.println("eating...");
  }  
}
 
class Dog extends Animal{
  void bark(){
    System.out.println("barking...");
  }  
}

class TestInheritance{
  public static void main(String args[]){  
    Dog d = new Dog();
    d.bark();  
    d.eat();  
  }
}

Kết quả:

barking...
eating...

Ví dụ kế thừa đa cấp trong Java

File: TestInheritance2.java

class Animal{  
  void eat(){
    System.out.println("eating...");
  }  
}

class Dog extends Animal{  
  void bark(){
    System.out.println("barking...");
  }  
}

class BabyDog extends Dog{
  void weep(){
    System.out.println("weeping...");
  }  
}

class TestInheritance2{
  public static void main(String args[]){  
    BabyDog d = new BabyDog();  
    d.weep();  
    d.bark();  
    d.eat();  
  }
}

Kết quả:

weeping...
barking...
eating...

Ví dụ kế thừa phân cấp trong Java

File: TestInheritance3.java

class Animal{  
  void eat(){
    System.out.println("eating...");
  }  
}

class Dog extends Animal{  
  void bark(){
    System.out.println("barking...");
  }  
}

class Cat extends Animal{  
  void meow(){
    System.out.println("meowing...");
  }  
}

class TestInheritance3{
  public static void main(String args[]){  
    Cat c = new Cat();  
    c.meow();  
    c.eat();  
    //c.bark(); lỗi
  }
}

Kết quả:

meowing...
eating...

Tại sao đa kế thừa không được hỗ trợ trong java?

Để giảm độ phức tạp và đơn giản hóa ngôn ngữ, đa kế thừa không được hỗ trợ trong java.

Hãy thử xem xét một kịch bản trong đó A, B và C là ba class.

Class C kế thừa các class A và B.

Nếu các class A và B có cùng một phương thức và bạn gọi nó từ đối tượng subclass, sẽ có sự mơ hồ để quyết định gọi phương thức của class A hoặc B.

Do lỗi thời gian biên dịch tốt hơn lỗi runtime, Java biểu hiện lỗi thời gian biên dịch nếu bạn kế thừa 2 class.

Vì vậy, cho dù bạn có cùng phương thức hay khác nhau hoàn toàn, sẽ có lỗi runtime.

class A{  
  void msg(){
    System.out.println("Hello");
  }  
}

class B{  
  void msg(){
    System.out.println("Welcome");
  }  
}

class C extends A, B{ // Giả sửa làm thế này
   
  public static void main(String args[]){  
    C obj = new C();
    obj.msg(); // Bạn đoán kết quả là gì?
  }  
}

Kết quả:

Compile Time Error

Bạn đã hiểu về kế thừa IS-A trong Java chưa?

Trong bài này mình đã giải thích cho bạn về kế thừa IS-A trong Java, các thuật ngữ trong kế thừa cũng như các ví dụ về kế thừa một class trong Java.

Tham khảo:

Hãy thực hiện lại ví dụ nhiều lần để đảm bảo bạn đã quen thuộc với cú pháp cũng như ý nghĩa của kế thừa trong Java nhé.

Chúc bạn tự học Java tốt!

JavaDEV