Sự khác biệt của Inheritance và Polymorphism trong Java

0
24
Rate this post

😉

Như chúng ta đã biết, khi bắt đầu học về Javacore, các expert trên Internet thường giới thiệu 4 tính chất của Java. Vậy bài viết này sẽ nêu rõ sự khác biệt giữa Kế thừa (Inheritance) và Đa hình (Polymorphism) trong JAVA.

Kế thừa trong Java là gì?

Kế thừa trong Java là cơ chế cho phép một lớp con có thể sử dụng các thuộc tính và hành vi của lớp cha (được gọi là lớp cha). Ưu điểm chính của kế thừa là cung cấp khả năng tái sử dụng code. Dưới đây là ví dụ về kế thừa đơn (Single Inheritance):

class A {
    public void sum() {
        int a = 10;
        int b = 20;
        System.out.println("Tổng: " + (a + b));
    }
}

class B extends A {
    public void sub() {
        int a = 10;
        int b = 20;
        System.out.println("Hiệu: " + (a - b));
    }
}

class Main {
    public static void main(String[] args) {
        B objB = new B();
        objB.sum();
        objB.sub();
    }
}

Kết quả:

Tổng: 30
Hiệu: -10

Kế thừa cho phép lớp con sử dụng các thuộc tính và phương thức của lớp cha. Vì lớp B kế thừa từ lớp A, đối tượng của lớp B có thể gọi cả phương thức sum() và sub(). Nhờ đó, ta có thể hiểu rõ hơn về kế thừa.

Đa hình trong Java là gì?

Đa hình (Polymorphism) trong Java cho phép đối tượng biểu diễn các hành vi khác nhau trong suốt cuộc đời của nó. Đa hình chủ yếu gồm hai loại: nạp chồng (overloading) và ghi đè (overriding).

Nạp chồng (Overloading)

Nạp chồng cho phép các phương thức trong cùng một lớp hoặc lớp con có cùng tên nhưng có các tham số khác nhau. Đây còn được gọi là “static binding” và “compile-time polymorphism”. Dưới đây là một ví dụ để hiểu rõ hơn:

class Overloading {
    public int sum() {
        int a = 10;
        int b = 20;
        return a + b;
    }

    public int sum(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        Overloading objO = new Overloading();
        System.out.println(objO.sum());
        System.out.println(objO.sum(10, 30));
    }
}

Kết quả với Overloading:

30
40

Trong ví dụ trên, lớp Overloading có hai phương thức sum cùng tên nhưng khác số lượng tham số. Phương thức sum đầu tiên không có tham số và phương thức sum thứ hai có hai tham số đầu vào.

Ghi đè (Overriding)

Ghi đè (Overriding) cho phép lớp con triển khai lại một phương thức đã tồn tại trong lớp cha của nó. Ghi đè còn được gọi là “late binding”, “dynamic binding” và “runtime polymorphism”. Dưới đây là một ví dụ để hiểu rõ hơn:

class Vehicle {
    public void display() {
        System.out.println("Đây là phương tiện");
    }
}

class Car extends Vehicle {
    public void display() {
        System.out.println("Đây là ô tô");
    }
}

class Main {
    public static void main(String[] args) {
        Car objCar = new Car();
        objCar.display();
    }
}

Kết quả của Ghi đè:

Đây là ô tô

Lớp Car được kế thừa từ lớp Vehicle và triển khai lại phương thức display(). Mặc dù lớp cha cũng có phương thức display(), nhưng nó bị ghi đè bởi phương thức display() trong lớp con, do đó kết quả cuối cùng là “Đây là ô tô”.

Điểm khác biệt giữa Kế thừa và Đa hình trong Java

Định nghĩa

Kế thừa là cơ chế cho phép lớp con sử dụng các thuộc tính và phương thức của lớp cha, trong khi đa hình là khả năng của một đối tượng có thể hành xử theo nhiều cách khác nhau. Đó là sự khác biệt chính giữa Kế thừa và Đa hình trong Java.

Thực hiện

Thực hiện kế thừa xảy ra ở cấp lớp, trong khi thực hiện đa hình xảy ra ở cấp phương thức.

Sử dụng

Kế thừa cung cấp khả năng tái sử dụng code, trong khi đa hình cho phép gọi các phương thức phù hợp tại thời gian biên dịch và thời gian chạy. Đây là sự khác biệt khác giữa Kế thừa và Đa hình trong Java.

Kết luận

Kế thừa và Đa hình là hai khái niệm liên quan nhau, vì đa hình áp dụng cho các lớp cũng triển khai khái niệm kế thừa.

Sử dụng tính kế thừa trong Java để ghi đè phương thức (method overriding) trong đa hình, ta có thể thu được tính đa hình tại thời điểm chạy.

Nguồn tham khảo:

Quý bạn có thể tìm hiểu thêm về chủ đề này trên trang web Dnulib để nắm vững kiến thức Java.