2013-11-14 23 views
0

foundJAI庫中PerspectiveTransform類的transform方法如下代碼:數組將通過Java中的引用返回嗎?

public void transform(double[] srcPts, int srcOff, 
       double[] dstPts, int dstOff, 
       int numPts) { 

     if (srcPts == null) { 
      throw new IllegalArgumentException(JaiI18N.getString("Generic0")); 
     } 

     if (dstPts == null) { 
      dstPts = new double[numPts * 2 + dstOff]; 
     } 

     while (numPts-- > 0) { 
      double x = srcPts[srcOff++]; 
      double y = srcPts[srcOff++]; 
      double w = m20 * x + m21 * y + m22; 

      if (w == 0) { 
       dstPts[dstOff++] = x; 
       dstPts[dstOff++] = y; 
      } else { 
       dstPts[dstOff++] = (m00 * x + m01 * y + m02)/w; 
       dstPts[dstOff++] = (m10 * x + m11 * y + m12)/w; 
      } 
     } 
    } 

看起來如果dstPtsnull,則創建新的數組。但是這個數組不會返回外面,不是嗎?

+0

是的,你說得對,java按價值傳遞。 – nachokk

回答

2

你說得對,如果這是實際的代碼。我想人們在使用這個方法時不會將null作爲參數傳遞,但即使如此也是一個錯誤。

0

數組是對象,它們的引用是按值傳遞的。

+0

你給出了正確的答案,但把最重要的部分放在最後。 –

+0

是的。但它是_original_參考的副本。所以你不能在方法中做'dstPts = new double [numPts * 2 + dstOff];'並且期望它在外面有任何效果。所以你給出了一個大致正確但誤導性的答案。 – CPerkins

+0

對象無法通過,期間。 – newacct

3

只是一個說明:Java總是按價值傳遞。底部的小行是當你傳遞一個對象作爲參數時,它的引用是實際傳遞的值。

例如,C#有ref關鍵字,它允許傳遞引用。在Java中,你必須將你的對象包裝在一個容器中,並與容器一起工作,這樣你就可以自由地切換底層元素。

正如你所說,除非返回,否則新的數組將不能從外部訪問。我知道這樣做是爲了防止以下while拋出一個NPE,但處理結果會丟失,因爲該方法實際上是編碼的。

+3

** Java總是按值**傳遞。究竟。沒有ifs或buts。 –

+0

「是,當你傳遞一個對象作爲參數」事情是,你不能在Java中傳遞一個對象作爲參數。對象不是Java中的值。 Java中唯一的類型是基元類型和引用類型。因此,每個參數必須是原始類型或引用類型。沒有「對象類型」。 – newacct

+0

@newacct「底部的小行是當你傳遞一個對象作爲參數時,**它的引用是實際傳遞的值**。」我不知道你是在澄清還是在糾正我,但是你的引用看起來不符合語境。 – Gamb