在方法的使用-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
沒有留言:
張貼留言