2011-07-10 3 views
0

私はアンドロイドのゲームを作ろうとしています 私のメインクラスにはビットマップとキャンバスのインスタンスがあります。クラスインスタンスの問題、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); 
    } 
} 

、私は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は、オブジェクトへの参照を渡すだけでなく、より多くのリソースを消費します。