2017-03-06 6 views
0

このループにはpawnという名前の変数が1つありますが、ループはその変数を使用して8 Pawnを作成します。これはどのように可能ですか?そして、この1つの変数から作成された各ポーンを区別できますか?同じ変数名を持つforループ内の複数のオブジェクトを初期化するとどうなりますか?

public void setUpChessPieces() { 
    for (int i = 0; i < ChessGame.EIGHT; i++) { 
     //param 1:row, param 2:col, param 3:player#, param4:chess piece color 
     Pawn pawn1 = new Pawn(1, i, 1, "white"); 
     //squares has a setPiece method 
     squares[1][i].setPiece(pawn1); 
    } 
} 
+0

変数 "名前"は実際にはそれほど重要ではなく、多くのオブジェクトには存在せず、*ほとんど*コンパイルされたコードには存在しません。そして、オブジェクトが複数の変数によって参照される場合、どちらがこのオブジェクトの "名前"を表しますか?もっと重要なのは、オブジェクト**のリファレンス***とそれらの取得方法です。 –

答えて

2

次のようになり、何が起こるかの短いコックダウン:

new Pawn(1, i, 1, "white"); 

JVMは、ヒープ上に新しいオブジェクトを割り当てます。

Pawn pawn1 = new Pawn(1, i, 1, "white"); 

新たに割り当てられたオブジェクトへの参照がpawn1に割り当てられます。リファレンスは、「ヒープ内のこの場所でオブジェクトを探す」という値として考えることができます。

squares[1][i].setPiece(pawn1); 

setPieceがオブジェクトを参照して呼び出されています。

ループが終了し、pawn1が「消えます」。これは、pawn1自体にアクセスできなくなったことを意味します。オブジェクト自体がヒープに格納されているため、消えません。このプロセスは、ループが完了するまで繰り返されます。

オブジェクトが破棄されるプロセスはガベージコレクションと呼ばれ、まだ使用されているオブジェクト(参照が格納されたオブジェクトはpawn1など)には影響しません。

これらのポーンはどのように区別できますか?
参考にしてください。各オブジェクトは、ヒープ上の別の場所に格納されています。すべての作業は、JVMの内部POVからの違いを認識するために場所を比較することだけです。

2

、あなたがnewで作成された参照を保存

squares[1][i].setPiece(pawn1); 

を言います。 newに電話するたびに、pawn1という名前の一時的な参照を作成しますが、先にsetPieceの呼び出しで保存します。 squaresに参照がある限り、でガベージコレクションに適格ではありません。

+0

これは、ポーンがそれぞれ異なる参照を持つことを意味します。つまり、私は各ポーンを右に動かすことができますか?言い換えれば、8人のポーンはすべて同じではありませんか? – tragicProgrammer

+0

@tragicProgrammer提示されているように、はい。それは正しいです。 –

2

どうすれば可能ですか?

forループの繰り返しごとにpawnインスタンスが作成される可能性があります。 pawn1は、作成したobjectの識別子に過ぎません。 forループの繰り返しで作成された各オブジェクトは、ヒープメモリに格納された独立したオブジェクトです。

Pawn pawn1 = new Pawn(1, i, 1, "white"); 

そして、私たちは は、この一つの変数から作成されていることを、それぞれのポーンを区別することができますか?

pawn1識別子ではなく、それらの基礎となるデータで区別することができます。たとえば、pawnオブジェクトのそれぞれがtoString()メソッドをオーバーライドしていて、これを印刷した場合、2つの異なるオブジェクトが同じ基礎データを持っていなければ、異なるオブジェクトであることに気付くでしょう。同じstring表現を持ちます。

0

変数は単なるオブジェクトへのポインタです(何も指さないでnull)。あなたが物理的なチェスボードを持っていて、各ポーンを指で指していたら、同じポインタを持つ16の別個のオブジェクトを指すことができます。これはJavaでも同じです。

後で別のポインタを維持することによって各オブジェクトを取得できます。あなたのコードはpawn1ポインターの値をsquares要素のそれぞれにコピーすることでそれを行います。

ループが終了すると、pawn1ポインタ(変数)が有効範囲外になり消えますが、squares参照はスコープ内に残ります。

ただし、squaresの値を置き換えずに参照先(ポインタ)を以前のオブジェクトにコピーしないと、以前のオブジェクトへの最後の参照が永久に失われ、到達不能になります。

オブジェクトは「変数」から作成されません。それらはnew(通常)の呼び出しから作成され、結果のオブジェクトへのポインタが返されます。おそらく変数への代入や何らかの操作に関与するためです。結果の参照を捨てることもできますが、それはおそらくエラーです。

オブジェクトを作成して、最終的な変数、プリミティブまたは参照に異なる値を割り当てることができるように、異なる値を保持するために使用された同じ変数に参照を割り当てることができます。

関連する問題