2021年6月23日 星期三

JAVA 方法的使用-04 傳值或傳址的測試

   在方法的使用-01 已經有提到了,這邊特別再寫一次,基本上是比較進入方法前後(方法內對變數做更動),其值不變的就是傳值,其值改變的就是傳址,這是因為傳址的參數是讓電腦依位置更動其內容,所以改到的是同一個變數。而傳值的參數是方法有設變數接收其值,所以之後在方法內做的更動並不會動到原本的變數。

  不過,對於字串並不是這麼一回事,字串一旦宣告了就不能改變其值,後來所做的更改是令新的位址存新的值指定給原本的變數,而舊的值仍在原本的位址,沒有被取代。在傳給方法時,發生了什麼事,在以下範例的註解有說明。

/* 傳址或傳值的測試 */

public class AorV {

public static void funA(int aa, double bb, char cc, String dd, int ee[]) {
System.out.println("  已進入方法 A 中!");
System.out.println("    改值前" + aa + "," + bb + "," + cc + "," + dd + "," + ee[0]);
aa*=100;
bb*=100;
cc= '哭';
dd= "你恨我!";
ee[0] = 0;
System.out.println("    改值後" + aa + "," + bb + "," + cc + "," + dd + "," + ee[0]);
System.out.println("  方法 A 結束!");
}

public static void main(String[] args) {
int a = 1;
double b = 3.1415926;
char c = '笑';
String d = "我愛你";
int e[] = {1024, 2048};

System.out.println("主程式" + a + "," + b + "," + c + "," + d + "," + e[0]);
funA( a, b, c, d, e);
System.out.println("主程式" + a + "," + b + "," + c + "," + d + "," + e[0]);
// 進入方法的前後,a、b、c 值沒有變,屬於傳值,
// 那 d 也沒有變啊!為什麼不屬於傳值?實際上字串一旦宣告完成就不能再改變所屬位址的值,
// 在方法中給 dd 指定了舊的位址,然後指定新的值時,
// 其實只是新的位址內存了新的值並指定給 dd ,原本的值仍在,沒有被取代。
// e 的值變了,屬於傳址,雖然看起來是只有傳 e[1] ,但其實是傳址過去,
// 所以方法那邊不只可以用 e[1],也可用 e[0]。

}
}

結果
主程式1,3.1415926,笑,我愛你,2048
  已進入方法 A 中!
    改值前1,3.1415926,笑,我愛你,1024
    改值後100,314.15926,哭,你恨我!,0
  方法 A 結束!
主程式1,3.1415926,笑,我愛你,2048

Process finished with exit code 0

沒有留言:

張貼留言