JavaRush /Blog Java /Random-VI /Nghỉ giải lao #111. Đa hình và liên kết động trong Java. ...

Nghỉ giải lao #111. Đa hình và liên kết động trong Java. Ví dụ về vòng lặp for trong Java + forEach

Xuất bản trong nhóm

Đa hình và liên kết động trong Java

Nguồn: Đa hình DZone là một trong những khái niệm cốt lõi của lập trình hướng đối tượng. Cho dù bạn là người mới làm quen với lập trình Java hay là một nhà phát triển dày dạn kinh nghiệm, bạn cũng nên biết tính đa hình là gì và nó hoạt động như thế nào. Hầu hết các nhà phát triển đều khẳng định mình thông thạo chủ đề này, nhưng khi nói đến các tính năng phức tạp khác như liên kết tĩnh và liên kết động, nhiều người trong số họ mất tự tin. Nghỉ giải lao #111.  Đa hình và liên kết động trong Java.  Ví dụ về vòng lặp for trong Java + forEach - 1

Tính đa hình trong Java là gì?

Đa hình có nghĩa là có nhiều hình thức. Trong lập trình, điều này đề cập đến khả năng một tín hiệu hoặc thông báo xuất hiện ở nhiều dạng.

Ví dụ thực tế cuộc sống

Một người có thể thể hiện nhiều đặc điểm cùng một lúc. Ví dụ, một người mẹ có thể đồng thời là vợ, con gái, chị gái, nhân viên công ty, v.v. Vì vậy, một người có thể thể hiện những đặc điểm khác nhau trong những điều kiện khác nhau. Điều này được gọi là đa hình.

Tầm quan trọng của đa hình

Tính đa hình là một trong những tính năng quan trọng nhất của bất kỳ ngôn ngữ lập trình hướng đối tượng nào (ví dụ: Java). Với sự trợ giúp của tính đa hình, cùng một nhiệm vụ có thể được thực hiện theo nhiều cách khác nhau.

Các loại đa hình

Trong Java, tính đa hình có thể được chia thành hai loại:
  1. Đa hình thời gian biên dịch (liên kết tĩnh)
  2. Đa hình thời gian chạy (Thời gian chạy, liên kết động)

Đa hình thời gian biên dịch

Đa hình thời gian biên dịch còn được gọi là liên kết tĩnh. Kiểu đa hình này có thể đạt được thông qua nạp chồng hàm hoặc nạp chồng toán tử. Nhưng trong Java, điều này bị giới hạn ở việc nạp chồng hàm vì Java không hỗ trợ nạp chồng toán tử. Nạp chồng hàm Khi có ít nhất hai hàm hoặc phương thức có cùng tên hàm, nhưng số lượng tham số chúng chứa khác nhau hoặc ít nhất một kiểu dữ liệu của tham số tương ứng khác nhau (hoặc cả hai), thì đó được gọi là hàm hoặc nạp chồng phương thức và các hàm này được gọi là hàm nạp chồng. Ví dụ 1 Cho đến nay chúng ta đã nghiên cứu nạp chồng hàm là gì. Bây giờ hãy thử chứng minh tính năng nạp chồng của chức năng phần mềm.
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    // Method 2
    // having the same name but with 2 double parameters
    static double Addition(double a, double b)
    {
        // Returns sum of double numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Bạn có thể chạy chương trình trên tại đây . Giải thích chương trình:
  • Chương trình trên bao gồm hai hàm tĩnh có cùng tên: Phép cộng .

  • Ở đây, cả hai hàm đều chứa cùng một số tham số, nhưng các tham số tương ứng của chúng khác nhau.

  • Phương thức 1 chấp nhận hai tham số số nguyên, trong khi Phương thức 2 chấp nhận hai tham số kép .

  • Từ hàm main, trước tiên chúng ta gọi hàm Addition(12, 14) . Các tham số được truyền là số nguyên (12 và 14) nên Phương thức 1 sẽ được gọi ở đây.

  • Sau đó chúng ta gọi hàm Addition(15.2, 16.1) . Vì các tham số được truyền có kiểu dữ liệu kép (15.2 và 16.1), nên lần này Phương thức 2 sẽ được gọi .

  • Đây là cách thực hiện nạp chồng hàm trong Java dựa trên các kiểu dữ liệu tham số khác nhau.

Ví dụ 2 Xét chương trình sau:
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }

    // Method 2
    // having the same name but with 3 integer parameters
    static double Addition(double a, double b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Bạn có thể chạy chương trình trên tại đây . Giải thích chương trình:
  • Chương trình trên bao gồm hai hàm tĩnh có cùng tên: Phép cộng .

  • Ở đây, cả hai hàm đều chứa số lượng tham số khác nhau, nhưng kiểu dữ liệu của hai tham số tương ứng đầu tiên là giống nhau (số nguyên).

  • Phương thức 1 lấy hai tham số số nguyên và Phương thức 2 lấy ba tham số kiểu dữ liệu số nguyên.

  • Từ hàm main, trước tiên chúng ta gọi hàm Addition(2, 3) . Vì các tham số được truyền là số nguyên (2 và 3) nên chúng sẽ gọi Phương thức 1 tại đây .

  • Sau đó chúng ta gọi hàm Addition(4, 5, 6) . Các tham số được truyền vào là kiểu dữ liệu kép (4, 5, 6) nên lần này chúng sẽ gọi Method 2 .

  • Đây là cách các hàm bị quá tải trong Java dựa trên số lượng tham số khác nhau.

Ví dụ 3
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {
        // Return the sum
        return a + b;
    }
    // Method 2
    // having the same name but with 3 parameters
    // 1st parameter is of type double and other parameters
    // are of type integer
    static double Addition(double a, int b,  int c)
    {
        // Return the sum
        return a + b + c;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(2, 4));
        System.out.println(Addition(4.2, 6, 10));

    }
}
Bạn có thể chạy chương trình trên tại đây . Giải thích chương trình:
  • Chương trình trên bao gồm hai hàm tĩnh có cùng tên: Phép cộng .

  • Cả hai hàm đều chứa số lượng tham số khác nhau và kiểu dữ liệu của phần tử tương ứng đầu tiên cũng khác nhau.

  • Phương thức 1 lấy hai tham số số nguyên, trong khi Phương thức 2 lấy ba tham số - tham số đầu tiên thuộc loại double và hai tham số còn lại là kiểu dữ liệu số nguyên.

  • Từ hàm main, trước tiên chúng ta gọi hàm Addition(2, 4) . Vì các tham số được truyền là số nguyên (2 và 4) nên chúng sẽ gọi Phương thức 1 tại đây .

  • Sau đó chúng ta gọi hàm Addition(4.2, 6, 10) . Tham số đầu tiên được truyền là kiểu số nguyên và các tham số còn lại là kiểu dữ liệu double (4.2, 6, 10), vì vậy lần này Phương thức 2 sẽ được gọi .

  • Đây là cách Java đạt được khả năng nạp chồng hàm dựa trên số lượng tham số khác nhau cũng như các kiểu dữ liệu khác nhau của các tham số tương ứng.

Ghi chú. Một hàm không thể bị quá tải chỉ dựa vào kiểu trả về của hàm.

Đa hình thời gian chạy

Tùy chọn này còn được gọi là liên kết động. Trong quá trình này, chỉ được phép gọi một hàm được tạo cho một hàm khác trong thời gian chạy. Chúng ta có thể đạt được liên kết động trong Java bằng cách ghi đè phương thức.

Ghi đè phương thức

Ghi đè phương thức trong Java xảy ra khi một phương thức trong lớp cơ sở có định nghĩa trong lớp dẫn xuất. Một phương thức hoặc hàm của lớp cơ sở được gọi là phương thức được ghi đè.
// Class 1
class Parent {

    // Print method
    void Print()
    {

        // Print statement
        System.out.println("Inside Parent Class");
    }
}

// Class 2
class Child1 extends Parent {

    // Print method
    void Print() { System.out.println("Inside Child1 Class"); }
}

// Class 3
class Child2 extends Parent {

    // Print method
    void Print()
    {
        // Print statement
        System.out.println("Inside Child2 Class");
    }
}

class Main {

    public static void main(String args[]) {

        // Creating an object of class Parent
        Parent parent = new Parent();
        parent.Print();

        // Calling print methods
        parent = new Child1();
        parent.Print();

        parent = new Child2();
        parent.Print();
    }
}
Bạn có thể chạy chương trình trên tại đây . Giải thích chương trình:
  • Chương trình trên gồm 3 lớp: Parent ( lớp 1 ), Child1 ( lớp 2 ) và Child2 ( lớp 3 ). Lớp 2lớp 3 kế thừa lớp 1 .

  • Parent có một phương thức gọi là Print() . Bên trong hàm này chúng ta in " Inside Parent Class ". Child1Child2 cũng có các hàm Print() , về cơ bản sẽ ghi đè hàm Print() của lớp Parent và in " Inside Child1 Class " và " Inside Child2 Class " tương ứng trên bảng điều khiển.

  • Từ hàm chính, trước tiên chúng ta tạo một đối tượng của lớp cha được gọi là parent. Sau đó chúng ta sử dụng đối tượng này để gọi phương thức in của lớp cha . Do đó " Inside Parent Class " sẽ được in trên bảng điều khiển.

  • Sau đó, chúng ta gọi hàm tạo mặc định của lớp Child1 và gọi hàm Print() . Lưu ý rằng phương thức Print() được định nghĩa trong lớp Child1 bây giờ sẽ được gọi vì chúng ta đã ghi đè phương thức Print() của lớp cha . Do đó, " Inside Child1 Class " sẽ được in trên bảng điều khiển.

  • Cuối cùng, chúng ta gọi hàm tạo mặc định của lớp Child2 và gọi hàm Print() . Ở đây phương thức Print() được định nghĩa trong lớp Child2 sẽ được gọi vì chúng ta đã ghi đè phương thức Print() của lớp cha . Do đó, “ Inside Child2 Class ” sẽ được in trên bảng điều khiển.

  • Đây là cách ghi đè phương thức được thực hiện trong Java.

Kết quả

Trong bài viết này, chúng ta đã tìm hiểu tính đa hình trong Java là gì. Sau đó, chúng tôi đi sâu hơn vào chủ đề và thảo luận về hai loại đa hình trong Java: đa hình trong thời gian biên dịch và đa hình trong thời gian chạy. Chúng tôi đã chứng minh thông qua các chương trình cách có thể đạt được liên kết tĩnh và động trong Java.

Ví dụ về vòng lặp for trong Java + forEach

Nguồn: FreeCodeCamp Vòng lặp trong lập trình là một chuỗi các lệnh được thực hiện liên tục cho đến khi đáp ứng một điều kiện nhất định. Trong bài viết này, chúng ta sẽ tìm hiểu về vòng lặp forforEach trong Java. Nghỉ giải lao #111.  Đa hình và liên kết động trong Java.  Ví dụ về vòng lặp for trong Java + forEach - 2

Cú pháp vòng lặp trong Java

Đây là cú pháp để tạo vòng lặp for :
for (initialization; condition; increment/decrement) {
   // code to be executed
}
Hãy xem xét một số từ khóa trong mã:
  • for chỉ ra rằng chúng ta sẽ tạo một vòng lặp. Theo sau là dấu ngoặc đơn, chứa mọi thứ chúng ta cần để vòng lặp hoạt động.

  • quá trình khởi tạo xác định biến ban đầu là điểm bắt đầu của vòng lặp, thường là số nguyên.

  • điều kiện xác định số lần vòng lặp sẽ được thực hiện.

  • tăng / giảm tăng/giảm giá trị của biến ban đầu mỗi lần vòng lặp được chạy. Khi giá trị của biến tăng/giảm, nó sẽ tiến tới điều kiện đã chỉ định.

  • Lưu ý rằng mỗi từ khóa được phân tách bằng dấu chấm phẩy ( ; ).

Dưới đây là một số ví dụ:
for(int x = 1; x <=5; x++) {
  System.out.println(x);
}

/*
1
2
3
4
5
*/
Trong ví dụ trên, biến bắt đầu là x có giá trị là 1. Vòng lặp sẽ tiếp tục chạy miễn là giá trị của x nhỏ hơn hoặc bằng 5 - đây là điều kiện. x++ tăng giá trị của x sau mỗi lần chạy. Chúng tôi tiếp tục in giá trị của x dừng sau 5 vì điều kiện đã được đáp ứng. Không thể tăng lên 6 vì nó lớn hơn và không bằng 5. Trong ví dụ sau, chúng ta sẽ sử dụng vòng lặp for để in ra tất cả các giá trị trong một mảng.
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
  System.out.println(randomNumbers[i]);
}

// 2
// 5
// 4
// 7
Điều này gần giống như ví dụ cuối cùng. Ở đây chúng ta đã sử dụng độ dài của mảng làm điều kiện và giá trị ban đầu của biến là 0 vì số thứ tự của phần tử đầu tiên của mảng bằng 0.

Cú pháp vòng lặp forEach trong Java

Vòng lặp forEach được sử dụng đặc biệt để lặp qua các phần tử của một mảng. Cú pháp của nó trông như thế này:
for (dataType variableName : arrayName) {
  // code to be executed
}
Bạn sẽ nhận thấy cú pháp ở đây ngắn hơn vòng lặp for . Và vòng lặp forEach cũng bắt đầu bằng từ khóa for . Thay vì khởi tạo một biến bằng một giá trị, trước tiên chúng ta chỉ định kiểu dữ liệu (nó phải khớp với kiểu dữ liệu của mảng). Tiếp theo là tên biến của chúng tôitên của mảng , được phân tách bằng dấu hai chấm. Đây là một ví dụ để giúp bạn hiểu cú pháp tốt hơn:
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
  System.out.println(x + 1);
}

/*
3
6
5
8
*/
Trong ví dụ này, chúng tôi đã lặp qua từng phần tử và tăng giá trị ban đầu của chúng lên 1. Theo mặc định, vòng lặp sẽ dừng sau khi lặp qua tất cả các phần tử của mảng. Điều này có nghĩa là chúng ta không cần chuyển bất kỳ giá trị nào cho biến của mình hoặc chỉ định bất kỳ điều kiện nào để vòng lặp kết thúc.

Phần kết luận

Trong bài viết này, chúng ta đã tìm hiểu vòng lặp là gì và cú pháp tạo vòng lặp forforEach trong Java. Chúng tôi cũng thấy một số ví dụ giúp chúng tôi hiểu thời điểm và cách sử dụng chúng. Chúc mừng mã hóa!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION