Tính đa hình trong java

2 minute read

II. Lập trình hướng đối tượng trong Java:

B. Ghi đè phương thức và đa hình:

  1. Ghi đè phương thức (Method Overriding):

    • Ghi đè phương thức là quá trình mà một lớp con cung cấp một triển khai mới cho một phương thức đã được định nghĩa trong một lớp cha.
    • Phương thức ghi đè phải có cùng tên, cùng số lượng tham số và cùng kiểu trả về với phương thức gốc.
    • Cú pháp:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      
      class Superclass {
          void method() {
              // Phương thức của lớp cha
          }
      }
      
      class Subclass extends Superclass {
          void method() {
              // Phương thức của lớp con
          }
      }
      
    • Ví dụ:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      
      class Animal {
          void sound() {
              System.out.println("Animal makes a sound");
          }
      }
      
      class Dog extends Animal {
          void sound() {
              System.out.println("Dog barks");
          }
      }
      
  2. Đa hình (Polymorphism):

    • Đa hình là khả năng của một đối tượng để thể hiện nhiều hình dạng, có nghĩa là một đối tượng có thể thực hiện các hành vi khác nhau dựa trên ngữ cảnh mà nó được sử dụng.
    • Đa hình có hai loại: đa hình tại thời điểm biên dịch (compile-time polymorphism) và đa hình tại thời điểm chạy (runtime polymorphism).
    • Đa hình tại thời điểm biên dịch xảy ra khi compiler quyết định phương thức nào sẽ được gọi dựa trên kiểu của tham số trong phương thức.
    • Đa hình tại thời điểm chạy xảy ra khi phương thức thực sự được gọi tại thời điểm chạy dựa trên kiểu của đối tượng.
    • Ví dụ:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      class Animal {
          void sound() {
              System.out.println("Animal makes a sound");
          }
      }
      
      class Dog extends Animal {
          void sound() {
              System.out.println("Dog barks");
          }
      }
      
      public class Main {
          public static void main(String[] args) {
              Animal myAnimal = new Animal();
              Animal myDog = new Dog();
      
              myAnimal.sound(); // Animal makes a sound
              myDog.sound();    // Dog barks
          }
      }
      

    Trong ví dụ này, phương thức sound() được gọi từ đối tượng myAnimal sẽ gọi phương thức của lớp Animal, trong khi khi gọi từ đối tượng myDog (một thể hiện của lớp con Dog), nó sẽ gọi phương thức của lớp Dog, do đó thể hiện tính đa hình tại thời điểm chạy.