Java如何在調用方法時,同時改變實參的值?即形參改變實參。
Posted gavinjoeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何在調用方法時,同時改變實參的值?即形參改變實參。相关的知识,希望对你有一定的参考价值。
關鍵點:
實參:如果是基本類型,則實參不會變(傳的是值);如果是引用類型,則實參會改變(傳的是地址)。
具體實例和分析如下:
- 傳入參數為基本類型的變量
public class Java{
public static void main(String[] args){
int b =5;
changeInt(b);
System.out.println(b);
}
public static int changeInt(int a){
a =10;
return a;
}
}
// changeInt(b)之后输出的是5。
為什麼把b傳到changeInt()方法中之後,b的值沒有被修改為10?因為,基本類型和String均為值傳遞,想要實現你的需求只能改用物件,當然也可以使用集合類比如Map,或者陣列(這個比較方便)。也就是說,傳入參數為字串變數時同樣如此。
說明:在java類執行時,基本類型變數是存儲在棧中的,壓棧順序:
(1)主方法壓棧->(2)變數b壓棧->(3)靜態方法changeInt壓棧->(4)壓棧參數並修改為10->(5)退出changeInt方法,並彈出changeInt方法及其作用域內的資料->(6) 退出main方法。
列印結果5是列印經過方法修改為10後,退出方法後列印的變數的值,由於基底資料型別存儲在棧中,因此退出方法後,變數的值仍然是變數最初所在棧位置的值5.
//2) 傳入的形參是對象
public class Java{
public static void main(String[] args)
{
int b =5;
b = changeInt(b);
System.out.println(b);
}
public static int changeInt(int a){
a = 10;
return a;
}
}
//changeInt(b)之后输出的是10。
3) 傳入的形參是陣列
public class Java{
public static void main(String[] args){
int[]a = {23,57};
print(a);
test(a);
print(a);
}
public static void test(int[] num){ //顛倒陣列
inttemp = 0;
for(inti = 0;i < num.length/2; i++){
temp= num[i];
num[i]= num[num.length - 1 - i];
num[num.length- 1 - i] = temp;
}
}
public static void print(int[] num){ //列印陣列
for(inti = 0; i < num.length; i++){
System.out.print(num[i]+"");
}
System.out.println();
}
}
// 輸出:
23 57
57 23
為什麼在這裡方法退出後,變數的值變不回去了呢?
說明:在java中,陣列是參考類型變數,可以看成是一個物件,在創建一個陣列時,和創建一個新的物件時同樣的道理(畢竟創建時使用new關鍵字了),這個物件存放在堆記憶體中,棧記憶體中只是存放了它的位置索引(即在堆記憶體中的位置,相當於棧中放了它的門牌號),這樣在test方法中引用了陣列變數,同樣是通過棧中存放的位置索引找到這個變數在堆記憶體中的位置,然後進行修改操作,test方法可不是將它重新壓到棧中再修改的,是直接在堆中改,直接在堆中改,直接在堆中改(重要的事情說三遍),然後很淡定的退出了test方法,它是退出沒事了,堆中的陣列變數已經被不可逆轉的修改了,因此test方法前和方法後列印出來的陣列內容是不一樣的。
以上是关于Java如何在調用方法時,同時改變實參的值?即形參改變實參。的主要内容,如果未能解决你的问题,请参考以下文章
php函数,static,globalkeyword及三种变量作用域