2011-07-10 61 views
0

我正在嘗試製作Android遊戲 我的主類中有一個位圖和畫布實例。Android類實例的問題

我有另一個實例,可以說,渲染類。 該渲染器類在同一個包中,但不在我的主類的子類中。

如果我將位圖和畫布實例傳遞給該渲染器類的方法,並且該方法會將傳遞的位圖繪製到傳遞的畫布上,是傳遞實際實例還是創建新實例副本然後傳遞?那麼,我已經嘗試過,看到實際情況正在通過。因爲我看到位圖被繪製到畫布上。

這是我的問題,爲什麼通過實際的實例? 如果是這樣的 - >


public class instanceTest 
{ 
    static int num; 

    static void numIncrementor(int number) 
    { 
     number++; 
    } 

    public static void main(String[] args) 
    { 
     num = 0; 
     numIncrementor(num); 
     System.out.println(num); 
    } 
} 

在這裏,當我打印次數,我仍然會得到0,但與其他位圖和帆布的事情,我做派的實際情況。這讓我非常困惑。有人可以解釋嗎? 或者不同於原始類型的類對象總是這樣嗎?它會讓垃圾收集器變得瘋狂嗎?

在此先感謝您,如果您不瞭解我的英文,請告訴我,並且我會在此澄清僞代碼;

+1

我不太清楚你在這裏問什麼,但如果你想打印出來是1,你需要添加「num = number;」在數字++之後(或者甚至不需要numIncrementor的參數,只需將num ++放在方法中)。我可以建議你發佈你的僞代碼,因爲我不明白你的問題。它看起來像你正試圖設置並獲得另一個類中的靜態字段。如果是這種情況,請參閱http://stackoverflow.com/questions/3239039/set-value-of-private-static-field。您可能還想閱讀Java http://javadude.com/articles/passbyvalue.htm中的指針 –

回答

1

在開始編寫Java代碼之前,您應該確實閱讀Java tutorial

在上面的例子中,你傳遞了一個原語 - 所以它的值只是傳遞給方法,放在堆棧上並且該值被改變。這就是原語在Java中的工作原理。這意味着您的number變量只存在於numIncrementor方法的範圍內 - 並且不影響外部的內容。

您的實際代碼適用於對象。當你傳遞一個對象時,你實際上將這個引用傳遞給它。所以你對它做的每一個改變都會在實際的對象上完成。唯一的例外是你不能將對象重新分配給別的東西,因爲你只需要對堆進行引用 - 你可以將引用重新分配給堆上的另一個位置,但原始引用將繼續指向原始對象。

至於你對垃圾收集器的問題 - 不,它不會發瘋。它實際上工作很好。 (有不止一種類型的GC,但這是一個完全不同的討論)。

Java不使用Copy Constructors - 如果您想將對象的副本傳遞給方法,則應將其設置爲cloneable並傳遞clone。但是這可能不是你所需要的 - 注意Copy Constructors消耗更多的資源,而不僅僅是將引用傳遞給對象。