Skip to main content

Command Palette

Search for a command to run...

Bài 4: Polymorphism (Đa hình) trong Java

Published
5 min readView as Markdown

I. Định nghĩa Polymorphism

Định nghĩa Polymorphism:

Polymorphism (Đa hình) là khả năng của một đối tượng có thể được sử dụng dưới nhiều dạng khác nhau. Polymorphism cho phép các đối tượng khác nhau có thể được xử lý thông qua cùng một giao diện, hoặc cùng một phương thức có thể hoạt động theo nhiều cách khác nhau tùy thuộc vào ngữ cảnh sử dụng.

Các loại Polymorphism:

  1. Compile-time Polymorphism (Đa hình tại thời điểm biên dịch):

    • Còn được gọi là Method Overloading (Nạp chồng phương thức).

    • Xảy ra khi nhiều phương thức trong cùng một lớp có cùng tên nhưng khác nhau về danh sách tham số.

  2. Runtime Polymorphism (Đa hình tại thời điểm chạy):

    • Còn được gọi là Method Overriding (Ghi đè phương thức).

    • Xảy ra khi một phương thức trong lớp con có cùng tên, cùng kiểu trả về và cùng danh sách tham số với phương thức trong lớp cha.

II. Compile-time Polymorphism

Định nghĩa và cách thực hiện:

Compile-time Polymorphism đạt được thông qua Method Overloading, nơi nhiều phương thức có cùng tên nhưng khác nhau về danh sách tham số (số lượng hoặc kiểu dữ liệu của tham số).

Ví dụ minh họa:

public class MathUtils {

    // Phương thức cộng hai số nguyên
    public int add(int a, int b) {
        return a + b;
    }

    // Phương thức cộng ba số nguyên
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // Phương thức cộng hai số thực
    public double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        MathUtils mathUtils = new MathUtils();

        System.out.println("Sum of two integers: " + mathUtils.add(5, 10)); // Gọi phương thức add(int, int)
        System.out.println("Sum of three integers: " + mathUtils.add(5, 10, 15)); // Gọi phương thức add(int, int, int)
        System.out.println("Sum of two doubles: " + mathUtils.add(5.5, 10.5)); // Gọi phương thức add(double, double)
    }
}

Trong ví dụ trên, phương thức add được nạp chồng để xử lý các kiểu tham số khác nhau.

III. Runtime Polymorphism

Định nghĩa và cách thực hiện:

Runtime Polymorphism đạt được thông qua Method Overriding, nơi một lớp con định nghĩa lại một phương thức của lớp cha với cùng tên, cùng kiểu trả về và cùng danh sách tham số. Lớp con có thể cung cấp cách triển khai cụ thể cho phương thức đó.

Ví dụ minh họa:

class Animal {
    void sound() {
        System.out.println("This animal makes a sound.");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("The dog barks.");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("The cat meows.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.sound(); // Gọi phương thức sound() của lớp Animal
        myDog.sound();    // Gọi phương thức sound() của lớp Dog
        myCat.sound();    // Gọi phương thức sound() của lớp Cat
    }
}

Trong ví dụ trên, phương thức sound được ghi đè trong các lớp con DogCat, và hành vi của phương thức này thay đổi tùy thuộc vào đối tượng thực tế tại thời điểm chạy.

IV. Lợi ích và hạn chế của Polymorphism

Lợi ích:

  • Tính linh hoạt: Cho phép các lớp và đối tượng khác nhau có thể thay thế lẫn nhau mà không làm thay đổi mã nguồn sử dụng chúng.

  • Tính mở rộng: Dễ dàng thêm các lớp mới mà không ảnh hưởng đến mã nguồn hiện tại.

Hạn chế:

  • Quản lý phức tạp hơn: Đối với hệ thống lớn, việc quản lý và duy trì các mối quan hệ kế thừa và ghi đè có thể phức tạp.

  • Hiệu suất: Polymorphism tại thời điểm chạy (Runtime Polymorphism) có thể gây ra chi phí hiệu suất do cơ chế xác định phương thức phải được thực hiện tại thời điểm chạy.

V. Bài tập thực hành

Bài tập: Tạo một hệ thống quản lý động vật sử dụng polymorphism.

Yêu cầu:

  1. Tạo lớp Animal với phương thức makeSound().

  2. Tạo các lớp con Dog, Cat, và Cow kế thừa từ lớp Animal và ghi đè phương thức makeSound().

  3. Viết chương trình chính để tạo các đối tượng và gọi phương thức makeSound() để hiển thị âm thanh của từng loại động vật.

Mã nguồn mẫu:

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

class Cow extends Animal {
    @Override
    void makeSound() {
        System.out.println("Moo");
    }
}

public class AnimalSoundDemo {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        Animal myCow = new Cow();

        myDog.makeSound(); // Gọi phương thức makeSound() của Dog
        myCat.makeSound(); // Gọi phương thức makeSound() của Cat
        myCow.makeSound(); // Gọi phương thức makeSound() của Cow
    }
}

Tổng kết

Bài học này cung cấp một cái nhìn chi tiết về Polymorphism (Đa hình) trong Java, bao gồm định nghĩa, các loại đa hình, cách thực hiện, lợi ích, hạn chế và các ví dụ minh họa cụ thể. Việc nắm vững khái niệm này sẽ giúp bạn xây dựng các hệ thống phần mềm linh hoạt và dễ dàng mở rộng, cải thiện hiệu quả phát triển phần mềm.

More from this blog

devngu

169 posts