Học viên: Phạm Thế Dương
Email: duongphamhn97@gmail.com
Bài viết gốc: https://www.javatpoint.com/inheritance-in-java

Tính kế thừa trong Java

Tính kế thừa trong Java là một cơ chế trong đó một đối tượng có được tất cả các thuộc tính và hành vi của một đối tượng cha. Đây 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 tính kế thừa trong Java là việc bạn có thể tạo các class mới được dựa trên các class đã có sẵn. Khi bạn kế thừa từ một class có sẵn, bạn có thể tái sử dụng các phương thức và trường của class cha. Hơn nữa, bạn có thể thêm các phương thức và trường mới trong class hiện tại.

Tính kế thừa thể hiện quan hệ IS-A, còn gọi là quan hệ cha-con.

Tại sao nên sử dụng tính kế thừa trong Java

Các thuật ngữ

  • Class: Class là một tập hợp các đối tượng có chung tính chất. Nó là một bản mẫu hay một bản thiết kế mà từ đó các đối tượng được tạo ra.
  • Class con (Sub class/Child class): Class con là một class kế thừa từ class khác. Một số thuật ngữ khác để gọi class con trong tiếng Anh là “derived class”, “extended class”, hay “child class”.
  • Class cha (Super class/Parent class): Class cha là class được class con kế thừa. Một số thuật ngữ khác để gọi class cha trong tiếng Anh là “base class” hay “parent class”.
  • Tính tái sử dụng: Như tên gọi, tính tái sử dụng là cơ thế cho phép bạn sử dụng lại các trường và phương thức của class hiện tại khi bạn tạo một class mới. Bạn có thể sử dụng cùng trường và phương thức đã được định nghĩa ở class cha.

Cú pháp

class Subclass-name extends Superclass-name  
{  
   //methods and fields  
}  

Từ khoá extends chỉ ra rằng bạn đang tạo một class mới từ một class có sẵn. “extends” nghĩa là mở rộng các chức năng.
Trong thuật ngữ của Java, class được kế thừa gọi là class cha (parent class/super class), và class mới được gọi là class con (child class/subclass).

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

inheritance chart
Như đã thấy ở hình trên, Programmer là class con và Employee là class cha. Quan hệ giữa hai class là Programmer IS-A Employee (Lập trình viên LÀ-MỘT Nhân viên). Nghĩa là Programmer là một kiểu của Employee.

class Employee {  
   float salary = 40000;  
}  

class Programmer extends Employee {  
   int bonus = 10000;
   public static void main(String args[]) {  
      Programmer p = new Programmer();
      System.out.println("Programmer salary is:" + p.salary);  
      System.out.println("Bonus of Programmer is:" + p.bonus);  
   }
}

Kết quả:

Programmer salary is:40000.0
Bonus of programmer is:10000

Ở ví dụ trên, đối tượng Programmber có thể truy cập trường của class của nó cũng như của Employee class, đây là tái sử dụng code.

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

Trên cơ sở class, có ba kiểu kế thừa trong Java: đơn kế thừa, kế thừa nhiều cấp, kế thừa thứ bậc.
Trong Java, đa kế thừa và kế thừa hỗn hợp chỉ được hỗ trợ thông qua interface. Ta sẽ học về interface sau.
types of inheritance

Chú ý: Đa kế thừa trong Java không được hỗ trợ thông qua class.

Khi một class kế thừa nhiều class, đó là đa kế thừa. Ví dụ:
types of inheritance

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

Đơn kế thừa là khi một class kế thừa một class khác. Ở ví dụ dưới đây, Dog class thừa kế Animal class vì thế đây. là đơn kế thừa
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ụ về kế thừa nhiều cấp

Kế thừa nhiều cấp là khi có một chuỗi kế thừa. Ở ví dụ dưới đây, BabyDog class kế thừa Dog class mà class này lại kế thừa Animal class, vì thế đây là kế thừa nhiều cấp.
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ụ về kế thừa thứ bậc

Kế thừa thứ bậc là khi có từ hai class trở lên kế thừa một class. Ở ví dụ dưới đây, các class Dog và Cat kế thừa Animal class, vì thế đây là kế thừa thứ bậc.
File: TestInheritance.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();
   }
}  

Kết quả:

meowing...
eating...

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

Đa kế thừa không được hỗ trợ trong Java để giảm sự phức tạp và đơn giản hoá ngôn ngữ.
Hãy xem trường hợp có ba class A, B, C. Class C thế thừa từ class A và B. Nếu class A và B có cùng phương thức và bạn gọi nó từ đối tượng của class con, sẽ không thể biết được đang gọi phương thức của class A hay B.
Vì compile-time errors tốt hơn là runtime errors, Java sẽ ném ra compile-time error khi bạn kế thừa 2 class. Dù bạn có phương thức giống hay khác nhau, compile error vẫn sẽ được ném ra.

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

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

class C extends A, B { // suppose if it were
   
public static void main(String args[]) {  
      C obj = new C();
      obj.msg(); // Now which msg() method would be invoked?  
   }  
}

Kết quả:

Compile Time Error