私はJavaの中級初心者で、スタックオーバーフローもまったく初めてです。(これは私の最初の投稿です。)
次のコードと参照への値の割り当てについて質問があります。
まず、コード:
import java.awt.Point;
public class DrawPlayerAndSnake
{
static void initializeToken( Point p, int i )
{
int randomX = (int)(Math.random() * 40); // 0 <= x < 40
int randomY = (int)(Math.random() * 10); // 0 <= y < 10
p.setLocation( randomX, randomY );
/*
System.out.println("The position of the player is " + playerPosition + ".");
i = i + randomX;
System.out.println(" i lautet " + i + ".");
*/
Point x = new Point(10,10);
System.out.println("The position of the x is " + x + ".");
System.out.println("The position of the p is " + p + ".");
p.setLocation(x);
x.x = randomX;
x.y = randomY;
p = x;
System.out.println("The position of the p is now" + p + ".");
System.out.println("The x position of the p is now " + p.getX() + ".");
}
static void printScreen( Point playerPosition,
Point snakePosition )
{
for ( int y = 0; y < 10; y++ )
{
for ( int x = 0; x < 40; x++ )
{
if ( playerPosition.distanceSq( x, y ) == 0 )
System.out.print( '&' );
else if ( snakePosition.distanceSq( x, y ) == 0 )
System.out.print( 'S' );
else System.out.print( '.' );
}
System.out.println();
}
}
public static void main( String[] args )
{
Point playerPosition = new Point();
Point snakePosition = new Point();
System.out.println( playerPosition );
System.out.println( snakePosition );
int i = 2;
initializeToken( playerPosition , i );
initializeToken( snakePosition, i);
System.out.println( playerPosition );
System.out.println( snakePosition );
printScreen( playerPosition, snakePosition );
}
}
このコードは教育目的で変更されています (私はこれを理解しようとしています)。元のコードは、Chrisitan Ullenboom による本「Java ist auch eine Insel」からのものです。
さて、このメソッド intializeTokenがあり、クラスPointのインスタンスを渡しています。このメソッドが main メソッドによって呼び出されると、インスタンスplayerPositionへの新しい参照がPoint pによって作成されます。ここで、メソッドinitializeTokenに渡されるパラメータplayerPositionは最終的なものではないため、必要なポイントpへの割り当てを行うことができます。
しかし、参照変数xを使用して新しいポイント オブジェクトを作成し、この参照をp = x;によってpに割り当てると、playerPositionの x と y の位置は変わりませんが、p.setLocation()によって変わります。
誰でも理由を教えてもらえますか?