台灣最大程式設計社群網站
線上人數
733
 
會員總數:244416
討論主題:188635
歡迎您免費加入會員
討論區列表 >> Java >> 簡單java code問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
簡單java code問題
價值 : 50 QP  點閱數:233 回應數:6

樓主

Wilson Mak
門外漢
0 1
12 0
發送站內信



void runApp(){
int a = 1;
int b = 2;

System.out.println("Before update...");
System.out.println("a = " + a);
System.out.println("b = " + b);

update(a, b);

System.out.println("After update...");
System.out.println("a = " + a);
System.out.println("b = " + b);
}

void update(int a, int b)
{
a++;
b++;
System.out.println("In update...");
System.out.println("a = " + a);
System.out.println("b = " + b);
}

Output:
Before update...
a = 1
b = 2
In update...
a = 2
b = 3
After update...
a = 1
b = 2

我剛學了java半個月,我想問為什麼after update後a和b的值分別是1和2 而不是2和3.

void runApp(){
int[] a = {1, 2};

System.out.println("Before update...");
printArray(a);

update(a);

System.out.println("After update...");
printArray(a);
}

void update(int[] a)
{
for(int i = 0; i < a.length; i++)
{
a[i]++;
}

System.out.println("In update...");
printArray(a);
}


void printArray(int[] a)
{
for(int i = 0; i < a.length; i++)
{
System.out.println("a[" + i + "] = " + a[i]);
}
}

而這一題的result是:
Before update...
a[0] = 1
a[1] = 2
In update...
a[0] = 2
a[1] = 3
After update...
a[0] = 2
a[1] = 3

為什麼這一題array a[0] 和a[1]中的數值是2和3,而不是1和2,十分感激!!



搜尋相關Tags的文章: [ java ] , [ code ] , [ array ] ,
本篇文章發表於2019-01-19 14:35
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
a[i]++

a[i]= a[i] +1
的意思一樣。


(請多利用發文時候上面的按鈕,美化你的程式碼)
本篇文章回覆於2019-01-22 16:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

JavaHand
檢舉此回應
>> 我想問為什麼after update後a和b的值分別是1和2 而不是2和3.

Java 在 Method 呼叫時,皆使用傳值的方式(Call by value)

primitive type 在參數傳遞時,傳的是其值。
非 primitive type 在參數傳遞時,傳的也是值,但這個值指的是用來參照的記憶體位址的值。

所以在
int a = 1;
int b = 2;
update( a, b );
-> 進到 update( int a, int b ) 裡後
update 方法是一份新的記憶體位址區塊
update 裡的 int a 與 int b 與原來的 int a = 1; 跟 int b = 2; 是不同的記憶體位置。
在呼叫 update( a, b ); 時,會把 int a = 1; 跟 int b = 2; 的值傳給 update( int a, int b )
這時在 update 裡無論如何修改 a 與 b,都不會影響外面 int a = 1; 跟 int b = 2;
不知這樣說,會不會讓你有所了解呢?

至於第二段傳的是陣列
在 Java 中, 陣列也是一種物件,在方法呼叫時,傳的是這個陣列的記憶體參照位址。
所以在 update( int[] a ) 中,拿到的是外部陣列的記憶體參照位址,這時外部與 update 內部所存取到的陣列內容是同一份。

本篇文章回覆於2019-01-31 17:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

ㄚ鈞
檢舉此回應
第一種是傳值呼叫(call by value), 將變數(假設叫他變數A)的值複製一份傳遞到方法內, 方法內區域變數接到值之後+1, 印出來自然會是+1後的值, 方法執行完之後區域變數生命週期就結束了, 然後回呼叫端, 由於方法內的區域變數位址跟變數A的位址不同, 所以變數A從來沒有被改變. 印出來還是原本的值.

第二種方法是傳址呼叫(call by reference), 傳遞的是陣列變數, 其中紀錄有位址, 方法外與方法內修改陣列變數都是修改同一個位址上的值, 所以方法執行完印出陣列的值, 跟方法內印出的改變後的值是相同的.

本篇文章回覆於2019-02-20 15:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

JavaHand
檢舉此回應
Java 都是 Call by value
本篇文章回覆於2019-02-20 15:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

ㄚ鈞
檢舉此回應
原來如此 ^^"
本篇文章回覆於2019-02-21 14:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

JavaHand
檢舉此回應
這兩張圖供您參考



本篇文章回覆於2019-02-21 16:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.