我是一个中级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方法调用此方法时, Point p 将创建一个新的引用 - 比如实例 playerPosition 。 现在,因为传递给方法 initializeToken 的参数 playerPosition 不是最终的,所以我可以做任何指向 p 的任务。< / p>
但是当我使用引用变量 x 创建一个新的点对象并通过 p = x; 将该引用分配给 p 时x playerPosition 的y位置不会改变,但是 p.setLocation()会改变。
谁能告诉我为什么?
答案 0 :(得分:4)
传递给initializeToken的Point p是对存储在内存中的p实例的本地引用。当你调用p.setLocation()时,你正在“解除引用”p,即修改内存中的实际实例。但是,如果您只是设置p = new Point(x,y),那么您将修改initializeToken方法中的局部变量,该方法将在方法终止后消失。