1.傳遞參數

現在樂趣開始了。您可能已經從類似的方法中了解到System.out.println()我們可以將參數傳遞給方法。一旦我們進入方法內部,我們就將它們稱為參數。事實上,參數極大地增強了我們從創建和使用方法中獲得的好處。

我們如何聲明帶參數的方法?其實很簡單:

public static void name(parameters)
{
  method body
}

其中name 是方法的唯一名稱,method body 代表組成該方法的命令。Andparameters 是方法參數的佔位符,以逗號分隔。讓我們更詳細地描述這個模板:

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

例子:

代碼 解釋
public static void print(String str)
{
}
print方法使用參數聲明:
String str
public static void print(String str, int count)
{
}
print方法使用兩個參數聲明:
String str
int count
public static void write(int x, int y)
{
}
write方法使用兩個參數聲明:
int x
int y

如果我們不想讓方法有參數,那麼我們就把括號留空。

參數是方法中的特殊變量。在它們的幫助下,您可以在調用方法時將各種值傳遞給該方法。

例如,讓我們編寫一個方法,將一串文本顯示給定的次數。

您已經知道如何編寫代碼在屏幕上多次顯示一個字符串。但是你應該打印哪個字符串呢?多少次?這就是我們需要參數的原因。

執行此操作的代碼如下所示:

代碼 解釋
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);
   }
}


我們printLines使用以下參數聲明該方法:
String textint count
該方法顯示 Stringtext count





我們printLines使用各種參數調用該方法

每次調用方法時,都會為其參數分配傳遞的值,然後我們才開始執行方法內部的命令。


2. 爭論

我想提請您多注意調用帶參數的方法。

傳遞給方法的值在傳遞給方法時通常稱為參數。

讓我們看另一個例子:

代碼 解釋
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);
   }
}


我們printLines使用以下參數聲明該方法:
String text,int count
該方法顯示 Stringtext count




我們printLines使用以下參數調用該方法:
text = "Hi"; count = 10;
text = "Bye"; count = 20;

printLines 第一次調用該方法時,它的參數被分配了以下值:
String text = "Hi", int count = 10

printLines第二次調用該方法時,其參數被賦予了不同的值:
String text = "Bye", int count = 20.

參數不多於也不少於調用方法時被賦予特定值的變量。值"Hi""Bye"1020本身稱為參數。”


3.調用方法時變量名衝突

變量可以用作方法參數。這是簡單易懂的,但它可能會產生一些困難。讓我們回到同一個例子,但這次我們將把參數移到單獨的變量中:

代碼 解釋
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";
     int n = 10;
     printLines(str, n);
   }
}


我們printLines使用以下參數聲明該方法:
String text,int count
該方法顯示 Stringtext count







我們printLines使用以下參數調用該方法:
text = str;
count = n;

到目前為止,還不錯:我們有一個str變量。text它的值在調用方法時分配給參數。我們有一個n變量。它的值在調用方法時分配給count參數。”至此,一切都清楚了。

現在讓我們重命名方法中的變量main

代碼 解釋
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";
     int count = 10;
     printLines(text, count);
   }
}


我們printLines使用以下參數聲明該方法:
String text,int count
該方法顯示 Stringtext count







我們printLines使用以下參數調用該方法:
text = text;
count = count;

注意兩點

第一:我們在不同的方法中有同名的變量。這些是不同的變量(我們故意用不同的顏色來描繪它們)。一切都與前面的示例相同,其中方法中的變量main被命名為strn

第二:調用該方法時不會發生任何神奇的事情。參數只是簡單地分配參數值。不管它們是數字、字符串、變量還是表達式。

在我們重命名 main 方法中的變量之後,什麼都沒有改變。它們以前是不同方法中的不同變量,所以它們仍然存在。text 在和變量之間沒有神奇的聯繫text 。



4.傳遞對方法的引用

我希望你已經理解了上一課的所有內容,因為現在我們將重新討論將參數傳遞給方法,只是我們會深入探討。

正如您已經知道的,一些 Java 變量存儲的不是值本身,而是一個引用,即值所在的內存塊的地址。這就是字符串變量和數組變量的工作方式。

當您將另一個數組變量分配給一個數組變量時,會發生什麼?這是正確的。這兩個變量開始引用內存中的相同空間:

傳遞對方法的引用

如果這些變量之一是方法參數,會發生什麼?

代碼 解釋
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     printArraySum(months);
   }
}


printArraySum方法計算傳入數組中數字的總和並將其顯示在屏幕上

完全相同的事情發生了:data 參數將包含對與變量相同的內存區域的引用months。調用該方法時,會發生一個簡單的賦值:。data = months

並且由於兩個變量都引用存儲整數的同一內存區域,因此該printArraySum 方法不僅可以從數組中讀取值,還可以更改它們!

例如,我們可以編寫自己的方法,用相同的值填充一個二維數組。這就是它的樣子:

代碼 解釋
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);
   }
}


fill 方法遍歷傳遞的二維數組中的每個單元格並分配value給它們。








我們創建一個二維數組。
我們用數字填充整個數組8


5.同名方法

現在讓我們再次回到方法名稱。

Java 標準要求同一類中的所有方法都具有唯一的名稱。換句話說,不可能在同一個類中聲明兩個同名方法。

當比較方法的相同性時,不僅要考慮名稱,還要考慮參數的類型請注意,不考慮參數的名稱。例子:

代碼 解釋
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
這三種方法是不同的方法。它們可以在同一個類中聲明。
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
這五種方法中的每一種都被認為是不同的。它們可以在同一個類中聲明。
void sum(int x, int y) {
}
void sum(int data, int value) {
}
這兩個方法被認為是相同的,這意味著它們不能在同一個類中聲明。

為什麼有些方法被認為是相同的,而另一些則不同?為什麼在確定方法的唯一性時不考慮參數名稱?

為什麼唯一性是必要的?關鍵是當編譯器編譯一個程序時,它必須確切地知道你打算在任何給定的地方調用哪個方法。

例如,如果你寫,編譯器很聰明,很容易斷定你打算用參數調用這裡的方法。System.out.println("Hi")println()String

但是,如果您編寫,編譯器將看到對帶有參數的方法的調用。System.out.println(1.0)println()double

調用方法時,編譯器確保參數的類型與參數的類型相匹配。它不注意參數的名稱。在 Java 中,參數名稱不幫助編譯器確定調用哪個方法。這就是為什麼在確定方法的唯一性時不考慮它們的原因。

方法的名稱及其參數的類型稱為方法簽名。例如,sum(int, int)

每個類都必須具有具有唯一簽名的方法,而不是具有唯一名稱的方法。