Đa hình Java

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về tính đa hình của Java và cách triển khai của nó với sự trợ giúp của các ví dụ.

Đa hình là một khái niệm quan trọng của lập trình hướng đối tượng. Nó chỉ đơn giản có nghĩa là nhiều hơn một hình thức.

Có nghĩa là, cùng một thực thể (phương thức hoặc toán tử hoặc đối tượng) có thể thực hiện các hoạt động khác nhau trong các tình huống khác nhau.

Ví dụ: Đa hình Java

class Polygon {

  // method to render a shape
  public void render() {
    System.out.println("Rendering Polygon...");
  }
}

class Square extends Polygon {

  // renders Square
  public void render() {
    System.out.println("Rendering Square...");
  }
}

class Circle extends Polygon {

  // renders circle
  public void render() {
    System.out.println("Rendering Circle...");
  }
}

class Main {
  public static void main(String[] args) {
    
    // create an object of Square
    Square s1 = new Square();
    s1.render();

    // create an object of Circle
    Circle c1 = new Circle();
    c1.render();
  }
}

Đầu ra

Rendering Square...
Rendering Circle...

Trong ví dụ trên, chúng ta đã tạo một lớp cha: Đa giác và hai lớp con: Hình vuông và Hình tròn . Lưu ý việc sử dụng render()phương pháp.

Mục đích chính của render()phương pháp này là hiển thị hình dạng. Tuy nhiên, quá trình vẽ hình vuông khác với quá trình vẽ hình tròn.

Do đó, render()phương thức hoạt động khác nhau trong các lớp khác nhau. Hoặc, chúng ta có thể nói render()là đa hình.

Tại sao Đa hình?

Tính đa hình cho phép chúng ta tạo mã nhất quán. Trong ví dụ trước, chúng ta cũng có thể tạo các phương thức khác nhau: renderSquare()và renderCircle()để hiển thị Hình vuông và Hình tròn , tương ứng.

Điều này sẽ hoạt động hoàn hảo. Tuy nhiên, với mỗi hình dạng, chúng ta cần tạo ra các phương pháp khác nhau. Nó sẽ làm cho mã của chúng tôi không nhất quán.

Để giải quyết vấn đề này, tính đa hình trong Java cho phép chúng ta tạo một phương thức duy nhất render()sẽ hoạt động khác nhau đối với các hình dạng khác nhau.

Lưu ý : print()Phương thức này cũng là một ví dụ của tính đa hình. Nó được sử dụng để in các giá trị của các loại khác nhau như charintstringvv

Chúng ta có thể đạt được tính đa hình trong Java bằng các cách sau:

  1. Ghi đè phương pháp
  2. Quá tải phương thức
  3. Người vận hành quá tải

Ghi đè phương pháp Java

Trong quá trình kế thừa trong Java , nếu có cùng một phương thức trong cả lớp cha và lớp con. Sau đó, phương thức trong lớp con sẽ ghi đè phương thức tương tự trong lớp cha. Đây được gọi là ghi đè phương thức.

Trong trường hợp này, cùng một phương thức sẽ thực hiện một thao tác trong lớp cha và một thao tác khác trong lớp con. Ví dụ,

Ví dụ 1: Tính đa hình bằng cách sử dụng ghi đè phương thức

class Language {
  public void displayInfo() {
    System.out.println("Common English Language");
  }
}

class Java extends Language {
  @Override
  public void displayInfo() {
    System.out.println("Java Programming Language");
  }
}

class Main {
  public static void main(String[] args) {

    // create an object of Java class
    Java j1 = new Java();
    j1.displayInfo();

    // create an object of Language class
    Language l1 = new Language();
    l1.displayInfo();
  }
}

Đầu ra :

Java Programming Language
Common English Language

Trong ví dụ trên, chúng ta đã tạo một lớp cha có tên là Ngôn ngữ và một lớp con có tên là Java . Ở đây, phương thức displayInfo()này có trong cả Ngôn ngữ và Java .

Việc sử dụng displayInfo()là để in thông tin. Tuy nhiên, nó đang in thông tin khác nhau bằng Ngôn ngữ và Java .

Dựa trên đối tượng được sử dụng để gọi phương thức, thông tin tương ứng được in ra.Làm việc của đa hình Java

Lưu ý : Phương thức được gọi được xác định trong quá trình thực thi chương trình. Do đó, ghi đè phương thức là một đa hình thời gian chạy .

2. Nạp chồng phương pháp Java

Trong một lớp Java, chúng ta có thể tạo các phương thức có cùng tên nếu chúng khác nhau về các tham số. Ví dụ,

void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }

Điều này được gọi là quá tải phương thức trong Java. Ở đây, cùng một phương thức sẽ thực hiện các thao tác khác nhau dựa trên tham số.

Ví dụ 3: Đa hình sử dụng nạp chồng phương thức

class Pattern {

  // method without parameter
  public void display() {
    for (int i = 0; i < 10; i++) {
      System.out.print("*");
    }
  }

  // method with single parameter
  public void display(char symbol) {
    for (int i = 0; i < 10; i++) {
      System.out.print(symbol);
    }
  }
}

class Main {
  public static void main(String[] args) {
    Pattern d1 = new Pattern();

    // call method without any argument
    d1.display();
    System.out.println("\n");

    // call method with a single argument
    d1.display('#');
  }
}

Đầu ra :

**********

##########

Trong ví dụ trên, chúng ta đã tạo một lớp có tên là Pattern . Lớp chứa một phương thức có tên display()được nạp chồng.

// method with no arguments
display() {...}

// method with a single char type argument
display(char symbol) {...}

Ở đây, chức năng chính của display()là in hoa văn. Tuy nhiên, dựa trên các đối số được truyền vào, phương thức đang thực hiện các hoạt động khác nhau:

  • prints a pattern of *, if no argument is passed or
  • prints pattern of the parameter, if a single char type argument is passed.

Lưu ý : Phương thức được gọi được xác định bởi trình biên dịch. Do đó, nó còn được gọi là đa hình thời gian biên dịch.

3. Nạp chồng toán tử Java

Một số toán tử trong Java hoạt động khác nhau với các toán hạng khác nhau. Ví dụ,

  • + operator is overloaded to perform numeric addition as well as string concatenation, and
  • operators like &|, and ! are overloaded for logical and bitwise operations.

Hãy xem cách chúng ta có thể đạt được tính đa hình bằng cách sử dụng nạp chồng toán tử.

Các +nhà điều hành được sử dụng để thêm hai thực thể. Tuy nhiên, trong Java, +toán tử thực hiện hai hoạt động.

1. Khi +được sử dụng với các số (số nguyên và số dấu phẩy động), nó thực hiện phép cộng toán học. Ví dụ,

int a = 5;
int b = 6;

// + with numbers
int sum = a + b;  // Output = 11

2. Khi chúng ta sử dụng +toán tử với chuỗi, nó sẽ thực hiện việc nối chuỗi (nối hai chuỗi). Ví dụ,

String first = "Java ";
String second = "Programming";

// + with strings
name = first + second;  // Output = Java Programming

Ở đây, chúng ta có thể thấy rằng +toán tử được nạp chồng trong Java để thực hiện hai phép toán: cộng và nối .

Lưu ý : Trong các ngôn ngữ như C ++, chúng ta có thể định nghĩa các toán tử để hoạt động khác nhau cho các toán hạng khác nhau. Tuy nhiên, Java không hỗ trợ nạp chồng toán tử do người dùng xác định.

Biến đa hình

Một biến được gọi là đa hình nếu nó tham chiếu đến các giá trị khác nhau trong các điều kiện khác nhau.

Các biến đối tượng (biến thể hiện) đại diện cho hành vi của các biến đa hình trong Java. Đó là bởi vì các biến đối tượng của một lớp có thể tham chiếu đến các đối tượng của lớp nó cũng như các đối tượng của các lớp con của nó.

Ví dụ: Biến đa hình

class ProgrammingLanguage {
  public void display() {
    System.out.println("I am Programming Language.");
  }
}

class Java extends ProgrammingLanguage {
  @Override
  public void display() {
    System.out.println("I am Object-Oriented Programming Language.");
  }
}

class Main {
  public static void main(String[] args) {

    // declare an object variable
    ProgrammingLanguage pl;

    // create object of ProgrammingLanguage
    pl = new ProgrammingLanguage();
    pl.display();

    // create object of Java class
    pl = new Java();
    pl.display();
  }
}

Đầu ra :

I am Programming Language.
I am Object-Oriented Programming Language.

Trong ví dụ trên, chúng ta đã tạo một biến đối tượng pl của lớp ProgrammingLanguage . Ở đây, pl là một biến đa hình. Điều này là bởi vì,

  • In statement pl = new ProgrammingLanguage(), pl refer to the object of the ProgrammingLanguage class.
  • And, in statement pl = new Java(), pl refer to the object of the Java class.

Đây là một ví dụ về upcasting trong Java.









Gõ tìm kiếm nhanh...