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 になりますが、他のビットマップとキャンバスのものでは、実際のインスタンスを送信します。これは私を本当に混乱させました。誰かがそれを説明できますか?それとも、プリミティブ型とは異なり、クラスオブジェクトには常に当てはまりますか? それはガベージコレクターを狂わせますか?

事前に感謝します。私の英語を理解していない場合は、教えてください。明確にするためにここに疑似コードを入れます。

4

1 に答える 1

1

Java コードを書き始める前に、 Java チュートリアルをよく読む必要があります。

上記の例では、プリミティブを渡しました。つまり、値がメソッドに渡され、スタックに配置され、その値が変更されます。これが、プリミティブが Java でどのように機能するかです。これは、number変数がメソッドのスコープ内にのみ存在し、numIncrementor外部に影響を与えないことを意味します。

実際のコードはオブジェクトで動作します。オブジェクトを渡すとき、実際にはヒープ上でそのオブジェクトへの参照を渡します。したがって、それに加えたすべての変更は、実際のオブジェクトに対して行われます。唯一の例外は、ヒープへの参照しか保持していないため、オブジェクトを別のものに「再割り当て」できないことです。ヒープ上の別の場所への参照を「再割り当て」できますが、元の参照は引き続き使用されます。元のオブジェクトを指します。

ガベージ コレクターに関するあなたの質問については、いいえ、気が狂うことはありません。実際にはかなりうまく機能します。(複数のタイプの GC がありますが、それはまったく別の議論です)。

Java は使用しませんCopy Constructors。オブジェクトのコピーをメソッドに渡したい場合は、それを作成してcloneableから渡す必要がcloneあります。しかし、これはおそらくあなたが必要としているものではありません -Copy Constructorsオブジェクトへの参照を渡すだけでなく、より多くのリソースを消費することに注意してください。

于 2011-07-10T05:58:24.667 に答える