2016-08-17 68 views
0
  1. 有人可以請回答爲什麼此代碼的輸出是225嗎?你爲什麼不改變222?
  2. 當您查看代碼no.2 a傳遞給test()時,它完全更改。我的問題是爲什麼數字1中的'a'在傳遞給test()時沒有改變,而數字2中的'a'改變了? 我是Java的初學者。

與Java中的數組混淆

public class Array1 
{  
    static void test(int[] a) 
    { 
     int[] b = new int[2]; 
     a = b; 
     System.out.print(b.length); 
     System.out.print(a.length); 
    } 

    public static void main(String[] args) 
    {  
     int[] a = new int[5]; 
     test(a); 
     System.out.print(a.length); 
    } 
} 

2.

public class Array2 
{ 
    static void test(int[] a) { 
    int[] b = new int[2]; 
    for(int i =0; i< a.length; i++) 
    { 
     a[i]=1; 
    } 
} 

public static void main(String[] args) 
{ 
    int[] a = new int[5]; 
    test(a);  
    for(int i =0; i< a.length; i++) 
    {   
     System.out.print(a[i]);  
    } 
} 

回答

0

讓我們來看看一步的情況下發生的第1步

主:int[] a = new int[5];:聲明一個變量參考主要指向一個5個整數的數組
main:test(a); :static void test(int[] a) {:與原始數組
測試基準調用測試聲明變量的Ref a成保持裁判呼叫者陣列=在測試>a另一個參考原始陣列
測試:int[] b = new int[2];:聲明在測試的2個整數
一個新的數組的Ref可變 測試:a = b;:使REF可變a在測試點到新數組=>原始數組是不變是在主

a變量剩餘的輸出現在正常。

現在情況2:

主:int[] a = new int[5];:聲明在主要指示一個參考變量至5個整數
主要的數組:test(a); :調用測試與原來的陣列
測試的引用:static void test(int[] a) {:聲明變量a成保持裁判呼叫者陣列的REF =在測試>a是另一參考到原始陣列
測試:int[] b = new int[2];:聲明測試中的ref變量爲2個整數的新數組
...
測試:a[i] = 1;:由於a是對原始數組的引用,因此您正在更改原始數組中的值。

現在輸出應該清楚了。

0

在第一個代碼你得到225:

有2個原因:

就讓地址是 - aa111 B的

令地址是 - bb111

1)您正在更改測試方法中的地址,因此在測試方法中,地址將變爲bb111。

2)但是你沒有返回a到它恢復到aa111的原始地址的主要方法。

3)如果您返回測試方法,您將得到222。

這裏是該

public class Array1 
    {  
      static int[] test(int[] a) 
      { 
       int[] b = new int[2]; 
       a = b; 
       System.out.print(b.length); 
       System.out.print(a.length); 
       return a; 
      } 
      public static void main(String[] args) 
      {  
       int[] a = new int[5]; 
       a = test(a); 
       System.out.print(a.length); 
      } 
    } 
代碼