"Xin chào Amigo! Tôi hy vọng bạn thích giải quyết các nhiệm vụ bằng các phương pháp của riêng mình và bạn nhận ra việc tạo ra các phương pháp tiện lợi như thế nào. Bây giờ hãy nói về chủ đề thú vị nhất."

"Bạn đã khơi gợi sự quan tâm của tôi, Diego... Một chủ đề mới?"

"Mọi chủ đề đều mới mẻ đối với bạn, người máy trẻ tuổi của tôi! Và chủ đề này cũng không ngoại lệ. Mặc dù một lần nữa nó nói về các phương thức. Bạn có thể đã nhận thấy rằng từ các phương thức như vậy, chúng ta có thể truyền đối số cho các phương thức. Khi chúng ta đã vào bên trong phương System.out.println()thức , chúng tôi gọi chúng là tham số."

"Tham số là những gì chúng ta viết bên trong dấu ngoặc đơn?"

"Vâng, chính xác. Và trên thực tế, các tham số giúp tăng cường đáng kể lợi ích mà chúng ta nhận được từ việc tạo và sử dụng các phương thức."

"Tôi hiểu những gì bạn đang nói về việc sử dụng chúng, và hóa ra là tôi đã làm rồi. Làm cách nào để khai báo một phương thức có tham số?"

"Nó thực sự khá đơn giản:

public static void name(parameters)
{
  method body
}

"Ở đâu namelà tên duy nhất của phương thức và method bodyđại diện cho các lệnh tạo nên phương thức. Và parameterslà trình giữ chỗ cho các tham số của phương thức, được phân tách bằng dấu phẩy."

"Hmm... Tôi nghĩ là tôi hiểu... Hoặc có thể là không..."

"Hãy để tôi cung cấp cho bạn thêm một số chi tiết về mẫu này để bạn chắc chắn rằng bạn hiểu rằng bạn hiểu:

public static void name(Type1 name1, Type2 name2, Type3 name3)
{
  method body
}

Dưới đây là một số ví dụ:

Mã số Giải trình
public static void print(String str)
{
}
Phương printthức được khai báo với một tham số:
String str
public static void print(String str, int count)
{
}
Phương printthức được khai báo với hai tham số:
String str
int count
public static void write(int x, int y)
{
}
Phương writethức được khai báo với hai tham số:
int x
int y

"À... Bây giờ thì đã rõ. Và nếu chúng ta không muốn phương thức có tham số, thì chúng ta chỉ cần để trống dấu ngoặc đơn."

"Chính xác. Về cơ bản, các tham số là các biến đặc biệt trong một phương thức. Với sự trợ giúp của chúng, bạn có thể truyền các giá trị khác nhau cho phương thức khi nó được gọi. Và nếu bạn không cần truyền các giá trị, thì bạn để trống các dấu ngoặc đơn.

"Ví dụ, hãy viết một phương thức hiển thị một dòng văn bản nhất định với số lần nhất định. Bạn có suy nghĩ gì về cách thực hiện việc này không?"

"Chà... Có vẻ như tôi biết rõ cách viết mã để hiển thị một chuỗi trên màn hình nhiều lần..."

"Bạn chỉ định chuỗi sẽ được hiển thị như thế nào? Và bạn chỉ định số dòng được hiển thị như thế nào? Bạn có đoán được không?"

"Mọi thứ đang bắt đầu trở nên rõ ràng... Có lẽ là nhờ sự trợ giúp của các tham số phương pháp?"

"Chính xác. Một tham số chuỗi cho dòng văn bản và một tham số số cho số dòng được hiển thị. Mã thực hiện điều này sẽ giống như sau:

Mã số Giải trình
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

Chúng tôi đã khai báo printLinesphương thức với các tham số sau:
String text, int count

Phương thức hiển thị Chuỗi text countlần



Chúng tôi gọi printLinesphương thức với các tham số khác nhau

"Mỗi khi một phương thức được gọi, các tham số của nó được gán các giá trị đã truyền và chỉ khi đó chúng ta mới bắt đầu thực thi các lệnh bên trong phương thức.

Tranh luận

"Tôi muốn bạn đặc biệt chú ý đến việc gọi các phương thức có tham số. Các giá trị được truyền cho phương thức thường được gọi là đối số khi chúng được truyền cho phương thức.

Hãy xem xét lại ví dụ của chúng tôi:

Mã số Giải trình
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Hi", 10);
     printLines("Bye", 20);
   }
}

Chúng ta đã khai báo printLinesphương thức với các tham số sau:
String text, int count

Phương thức hiển thị số text countlần Chuỗi


Chúng ta gọi printLinesphương thức với các đối số sau:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

"Khi printLinesphương thức được gọi lần đầu tiên, các tham số của nó được gán các giá trị sau:

String text = "Hi", int count = 10.

"Khi printLinesphương thức được gọi lần thứ hai, các tham số của nó được gán các giá trị khác nhau:

String text = "Bye", int count = 20.

"Các tham số không hơn không kém các biến được gán các giá trị nhất định khi một phương thức được gọi. Các giá trị "Hi", "Bye", 1020bản thân chúng được gọi là đối số."

"Tôi sẽ cố nhớ sự khác biệt và không nhầm lẫn các khái niệm này."

Xung đột tên biến khi gọi một phương thức

"Khi bạn gọi một phương thức, bạn có thể sử dụng các biến làm đối số.

"Chà, điều đó có ý nghĩa!"

"Điều này hợp lý, nhưng nó có khả năng gây ra một số khó khăn. Hãy quay lại ví dụ của chúng ta một lần nữa, nhưng lần này chúng ta sẽ chuyển các đối số thành các biến riêng biệt:

Mã số Giải trình
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Hi";
     String n = 10;
     printLines(str, n);
   }
}

Chúng ta đã khai báo printLinesphương thức với các tham số sau:
String text, int count

Phương thức hiển thị số text countlần Chuỗi



Chúng ta gọi printLinesphương thức với các đối số sau:
text = str;
count = n;

"Hmm... Tôi không thấy khó khăn gì. Chúng ta có một strbiến. Giá trị của nó được gán cho texttham số khi phương thức được gọi. Chúng ta có một nbiến. Giá trị của nó được gán cho counttham số khi phương thức được gọi." "Cho đến nay, mọi thứ đã rõ ràng."

"Tốt, tốt. Bây giờ hãy đổi tên các biến của chúng ta trong mainphương thức:

Mã số Giải trình
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String text = "Hi";
     String count = 10;
     printLines(text, count);
   }
}

Chúng ta đã khai báo printLinesphương thức với các tham số sau:
String text, int count

Phương thức hiển thị số text countlần Chuỗi



Chúng ta gọi printLinesphương thức với các đối số sau:
text = text;
count = count;

“Hãy chú ý đến hai điều

Đầu tiên: chúng ta có các biến có cùng tên trong các phương thức khác nhau. Đây là các biến khác nhau (chúng tôi cố tình mô tả chúng bằng các màu khác nhau). Mọi thứ hoạt động giống như trong ví dụ trước, trong đó các biến trong mainphương thức được đặt tên strn.

Thứ hai: Không có gì kỳ diệu xảy ra khi phương thức được gọi. Các tham số được gán đơn giản là các giá trị đối số. Bất kể chúng là số, chuỗi, biến hay biểu thức.

"Sau khi chúng tôi đổi tên các biến trong phương thức chính, không có gì thay đổi. Chúng là các biến khác nhau trong các phương thức khác nhau trước đây và vì vậy chúng vẫn giữ nguyên. Không có mối liên hệ kỳ diệu nào giữa hai textbiến."

"Bây giờ tôi biết."

Truyền tham chiếu đến các phương thức

"Tôi hy vọng bạn đã đồng hóa mọi thứ tôi đã nói với bạn về việc truyền đối số cho phương thức. Tôi nói như vậy bởi vì bây giờ chúng ta sẽ tìm hiểu sâu hơn một chút về chủ đề này. Hãy lắng nghe cẩn thận."

"Bạn đã biết rằng một số biến trong Java không lưu trữ chính các giá trị mà thay vào đó là một tham chiếu , tức là địa chỉ của khối bộ nhớ chứa các giá trị. Đây là cách hoạt động của biến chuỗi và biến mảng.

"Khi nhà phát triển gán một biến mảng khác cho một biến mảng, điều gì sẽ xảy ra?"

"Sau đó, họ có trỏ đến cùng một địa chỉ không?"

"Đúng. Hai biến bắt đầu đề cập đến cùng một không gian trong bộ nhớ:

"Và điều gì xảy ra nếu một trong các biến này là tham số của phương thức?

Mã số Giải trình
class Solution
{
   public static void sum(int[] data)
   {
     int total = 0;
     for (int i = 0; i < data.length; i++)
       total = total + data[i];
     System.out.println(total);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     sum(months);
   }
}


Phương sumthức tính tổng các số trong mảng truyền vào và hiển thị ra màn hình

"Chính xác thì điều tương tự cũng xảy ra: datatham số sẽ chứa một tham chiếu đến cùng một vùng bộ nhớ với monthsbiến. Khi phương thức được gọi, một phép gán đơn giản sẽ xảy ra: .data = months

"Và vì cả hai biến tham chiếu đến cùng một vùng bộ nhớ lưu trữ một số nguyên, nên phương sumthức không chỉ có thể đọc các giá trị từ mảng mà còn có thể thay đổi chúng!"

"Tôi đoán tôi hiểu, nhưng tôi cần thêm ví dụ!"

"Ví dụ, chúng ta có thể viết phương thức của riêng mình để điền vào một mảng hai chiều có cùng giá trị. Đây là giao diện của nó:

Mã số Giải trình
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


Phương fill thức lặp lại trên mọi ô trong mảng hai chiều đã truyền và gán valuecho chúng.






Chúng tôi tạo một mảng hai chiều.
Chúng tôi điền vào toàn bộ mảng với số 8.

Các phương thức có cùng tên

"Bây giờ chúng ta hãy quay lại tên phương thức một lần nữa."

"Tôi không thể tưởng tượng những gì khác có thể được nói về tên!"

"Chà, tiêu chuẩn ngôn ngữ Java yêu cầu tất cả các phương thức trong cùng một lớp phải có tên duy nhất.

"Vì vậy, không thể khai báo hai phương thức có tên giống hệt nhau trong cùng một lớp?"

"Bây giờ — hãy chú ý kỹ! Các phương thức trong một lớp thực sự có thể có tên giống hệt nhau! Nhưng trong trường hợp này, chúng phải có các tham số khác nhau. Nói cách khác, các phương thức được so sánh về tính giống nhau, không chỉ các tên được tính đến mà còn các loại tham số ! Lưu ý rằng tôi đã nói cụ thể các loại. Tên của các tham số không được tính đến . Ví dụ:

Mã số Giải trình
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Ba phương pháp này là những phương pháp khác nhau . Chúng có thể được khai báo trong cùng một lớp.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
Mỗi phương pháp trong số năm phương pháp này được coi là khác nhau . Chúng có thể được khai báo trong cùng một lớp.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
"Hai phương thức này được coi là giống nhau , nghĩa là chúng không thể được khai báo trong cùng một lớp."

"Tôi hoàn toàn bối rối! Tại sao chúng ta cần tất cả những thứ này? Tại sao một số phương thức được coi là giống nhau , trong khi những phương thức khác thì khác ? Và tại sao tên tham số không được tính đến khi xác định tính duy nhất của một phương thức? Tại sao tính duy nhất lại cần thiết tại tất cả?"

"Vấn đề là khi trình biên dịch biên dịch một chương trình, nó phải biết chính xác bạn định gọi phương thức nào ở bất kỳ vị trí cụ thể nào.

"Ví dụ, nếu bạn viết , trình biên dịch thông minh và sẽ dễ dàng kết luận rằng bạn định gọi phương thức ở đây có tham số. Nhưng nếu bạn viết , trình biên dịch sẽ thấy lời gọi phương thức có tham số. Nó không biết tên mà lập trình viên đã đặt cho tham số khi khai báo phương thức."System.out.println("Hi")println()StringSystem.out.println(1.0)println()double

Ahh, có vẻ như nó đang bắt đầu vượt qua!

"Khi một phương thức được gọi, trình biên dịch đảm bảo rằng các loại đối số khớp với các loại tham số. Nó không chú ý đến tên của các đối số. Trong Java, tên tham số không giúp trình biên dịch xác định phương thức nào sẽ được gọi. gọi.Lập trình viên cần chúng chứ không phải trình biên dịch.

"Và tôi đoán đó là lý do tại sao chúng không được tính đến khi xác định tính duy nhất của một phương pháp?"

"Vâng, điều đó hoàn toàn chính xác. Tên của một phương thức và các loại tham số của nó được gọi là chữ ký của phương thức . Ví dụ: sum (int, int)"

"Vì vậy, mỗi lớp phải có các phương thức có chữ ký duy nhất thay vì các phương thức có tên duy nhất."

"Làm tốt lắm, Amigo! Bạn đã tóm tắt bài học này một cách hoàn hảo. Nếu có điều gì chưa rõ ràng, đừng hoảng sợ. Chủ đề này sẽ trở nên rõ ràng sau một vài nhiệm vụ."