參考代碼:
public class PRoblem {
static int[] newArray = new int[]{1,2,3};
public static void main(String[] args) {
// TODOAuto-generated method stub
System.out.println(newArray.length);
addSpace1(newArray);
System.out.println(newArray.length);
}
public static void addSpace1(int[]a){
int[] b = new int[a.length*2];
System.arraycopy(a, 0,b, 0, a.length);
a = b;
}
}
可以看出,所給代碼在類內,main函數外定義了一個static的數組,并進行了初始化,長度為3,并且用函數寫了一個對數組進行擴容的函數,參數為數組。
在main函數里調用擴容函數,將之前定義和初始化后的數組當作參數傳入,執行操作后發現newArray的 長度并沒有改變,也就是說調用的擴容函數并沒有對newArray造成改變,這是為什么呢?
這是因為,把數組當作參數傳遞后,只是將數組的首地址的副本傳入,在函數里盡管對此副本改變了長度,也改變了首地址,但從根本上來說,并沒有對newArray的首地址造成改變,可以看到在函數里并沒有涉及到newArray的操作。
歸根結底,函數里的a只是局部變量,當函數結束以后,a就立刻失去了作用,肯定不會對newArray造成更改。
那么如果想要真切地改變newArray需要怎么寫呢?有兩種方法,
(1) 將函數設置為有返回值,將改變后的副本返回
int[] b = new int[a.length*2];
System.arraycopy(a, 0,b, 0, a.length);
a = b;
return a;
(2) 將 a = b 這一代碼改為 newArray = b;在這將擴容后的a,也就是b的首地址直接給newArray,使newArray可以訪問到擴容后的地址。
下面再來看第二種狀況:
參考代碼:
public class Text{
publicstatic void main(String[] args){
Scannerscan = new Scanner(System.in);
System.out.print("請輸入數組的長度:");
intn = scan.nextInt();
int[]a = new int[n];
for(inti = 0;i < n;i++){
System.out.print("請輸入第"+(i+1)+"個數值:");
a[i]= scan.nextInt();
}
//打印初始數組
print(a);
//更改數組的順序
change(a);
System.out.println();
//打印改變以后的數組
print(a);
}
public static void print(int[] a){
for(inti = 0;i < a.length;i++){
System.out.print(a[i]+"");
}
}
public static void change(int[] a){
inttemp = 0;
intn = a.length - 1;
for(inti = 0 ; i <= n/2 ; i ++){
//交換前面和后面數組的值的位置
temp = a[i];
a[i]= a[n - i];
a[n - i] = temp;
}
}
}
在該類里邊,新建和賦值了一個數組,且打印數組和使數組元素交換位置的方法已經寫好,運行可以發現,把數組作為參數傳入change函數進行元素位置交換,打印交換前和交換后的數組,發現元素順序的確改變了,這又跟第一個例子有不同之處。
具體原因在于:
在傳參的時候,是將數組的首地址傳給函數,在此,參數a也指向了原數組的空間,并且具備了操作空間的權利,所以在這個時候面對空間里的值進行改變的話,數組里的值也會相應改變,也就是main函數里的a和函數里的a都指向了那個空間,雖然在函數結束后局部變量a的生命周期結束,但是已經造成改變。
新聞熱點
疑難解答