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.
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.
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ụ:
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:
- Khóa học Lập trình Java online
- Hoặc tham gia Lập trình Java Full stack (Offline)
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!