Java程式演示值傳遞
在程式設計中,函式通常需要傳遞引數才能被呼叫。呼叫函式有兩種方法:第一種是引用呼叫,第二種是值傳遞。本文將演示如何在Java中進行值傳遞。
值傳遞是一種方法,其中引數的值被複制到函式中,因此在函式內對該引數所做的任何更改都不會影響該函式作用域之外引數的原始值。
為了更詳細地理解這些概念,我們需要理解用於描述函式引數型別的兩個術語。它們是實際引數和形式引數。形式引數是在函式頭部定義的,負責接收實際引數。實際引數是在函式呼叫期間“實際”傳遞給函式的值或變數。
不同方法
以下是演示值傳遞的不同方法:
使用值傳遞理解實際引數和形式引數
以下是演示值傳遞的步驟:
- 定義一個方法compute(int p, int q),它接受兩個整型引數p和q。這些是形式引數。
- 在方法中,返回p和q的和。
- 在主方法中,用值5和10分別初始化兩個整數r和s。
- 使用r和s作為引數呼叫compute方法,它們充當實際引數,並將結果儲存在一個名為sum的變數中。
- 列印sum的值,這將是r和s相加的結果。
示例
讓我們來看一個例子來理解實際引數和形式引數。
public class Main {
public static int compute(int p, int q) {
// These 2 variables, p and q are the formal parameters
return p+q;
}
public static void main(String[] args) {
int r=5, s=10;
int sum = compute(r, s); //r and s here are actual parameters
System.out.println("Sum = " + sum);
}
}
輸出
上述程式將產生以下輸出:
Sum = 15
現在記住實際引數和形式引數的概念,需要注意的是,在值傳遞中,實際引數和形式引數在不同的記憶體位置建立,而在引用傳遞中,實際引數和形式引數在相同的記憶體位置建立,因此它們是同步的或實際上是“可修改的”。
使用基本資料型別演示值傳遞
以下是演示Java中值傳遞的步驟:
- 定義一個方法modifyValue(int value),它接受一個整型引數value。
- 在modifyValue內部,列印引數的初始值。
- 透過新增10修改該值,並列印新值。
- 在主方法中,用值5初始化一個整數a。
- 列印a的初始值。
- 呼叫modifyValue(a),將其作為引數傳遞。請注意,只傳遞a的副本。
- 在函式呼叫之後再次列印a的值,以顯示它保持不變。
示例
這是一個簡單的例子,演示了Java中的值傳遞:
public class Main {
static void modifyValue(int value) {
System.out.println("The value of the variable inside of the function before any modifications is " + value);
value = value + 10;
System.out.println("The value of the variable inside of the function after adding 10 to it is " + value);
}
public static void main(String[] args) {
int a = 5;
System.out.println("The value of variable a, before calling the function is " + a);
//invoke the function and pass the argument
modifyValue(a);
System.out.println("The value of variable a, after calling the function is " + a);
}
}
輸出
上述程式將產生以下輸出:
The value of variable a, before calling the function is 5 The value of the variable inside of the function before any modifications is 5 The value of the variable inside of the function after adding 10 to it is 15 The value of variable a, after calling the function is 5
在Java中,像int、float、char等基本資料型別通常使用值傳遞傳遞給函式,而物件作為引用傳遞給方法。為了證明這一點,我們將在下面看到另一個例子。在這裡,我們將傳遞一個int(基本資料型別)和一個int陣列(一個物件)。這也將證明值傳遞和引用傳遞可以在一次函式呼叫中同時進行。
同時使用值傳遞和引用傳遞
以下是演示Java中值傳遞的步驟:
- 定義一個方法modifyValue(int value1, int[] value2),它接受一個整數value1和一個整型陣列value2作為引數。
- 在方法內部,列印value1和value2[0]的初始值。
- 透過新增10修改value1,並透過新增10更新value2[0]。
- 列印value1和value2[0]的修改後的值。
- 在主方法中,分別用值5和{5}初始化一個整數a和一個整型陣列b。
- 列印a和b[0]的初始值。
- 呼叫modifyValue(a, b),傳遞a和b作為引數。
- 在函式呼叫之後列印a和b[0]的值,以顯示a保持不變(按值傳遞),而b[0]被修改(按引用傳遞)。
示例
這是一個簡單的例子,演示了Java中的值傳遞:
public class Main {
static void modifyValue(int value1, int[] value2) {
System.out.println("The values of value1 and value2[0] are "+value1+" and "+value2[0]+" inside the function before any modifications");
value1 = value1 + 10;
value2[0] = value2[0] + 10;
System.out.println("The values of value1 and value2[0] are "+value1+" and "+value2[0]+" inside the function after adding 10 to them");
}
public static void main(String[] args) {
int a = 5;
int[] b = {5};
System.out.println("The value of variable a and b[0], before invoking the function is " + a+" and "+b[0]);
// call the function and pass both parameters as a and b respectively
modifyValue(a, b);
System.out.println("The value of variable a and b[0], after invoking the function is " + a+" and "+b[0]);
}
}
輸出
上述程式將產生以下輸出:
The value of variable a and b[0], before invoking the function is 5 and 5 The values of value1 and value2[0] are 5 and 5 inside the function before any modifications The values of value1 and value2[0] are 15 and 15 inside the function after adding 10 to them The value of variable a and b[0], after invoking the function is 5 and 15
在這種情況下,您可以看到在函式呼叫之前和之後,'a'的值保持不變,因為它按值傳遞。但是,作為物件的整型陣列b的值在函式呼叫之後發生了更改,因為它按引用傳遞。因此,它證明了在Java中,物件按引用傳遞,而基本資料型別按值傳遞。
結論
因此,我們已經看到了值傳遞的演示,並瞭解到它是一種呼叫函式的技術,其中引數的原始值不會改變。此外,值傳遞僅限於基本資料型別,所有物件(如陣列)都按引用傳遞。在值傳遞中,實際引數和形式引數的記憶體位置相同。在值傳遞中,函式內部所做的所有更改都只保留在函式的作用域內。值得注意的是,在一個函式呼叫中,可以同時實現值傳遞和引用傳遞,如上所示,其中一個整數和一個整型陣列(一個物件)作為引數傳遞給函式。最後,在值傳遞中,只傳遞值的副本。
理解值傳遞和引用傳遞之間的區別對於編寫高效可靠的程式碼至關重要。但是,總的來說,值傳遞更容易理解,並且不易出錯,但在處理大型資料結構的場景中可能會產生意想不到的後果。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP