将值分配给引用实例

3

我是一名初级的Java学习者,同时也是Stack Overflow完全的新手。(这是我的第一篇帖子)

我有一个关于下面代码和给引用赋值的问题。

首先,是这段代码:

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也是一个岛》。

现在有这个方法intializeToken,我正在传递类Point的实例。(我希望我说得对,如果我犯了错误,请随时纠正我。) 当主方法调用此方法时,通过Point p创建了一个新的引用,比如实例playerPosition。 现在,因为传递给方法initializeToken的参数playerPosition不是final,所以我可以对点p进行任何赋值。

但是,当我使用引用变量x创建一个新的点对象,并将此引用分配给p,即p = x;时,playerPosition的x和y位置不会改变,但通过p.setLocation()会发生改变。

有人能告诉我为什么吗?


p 看作是一个指向 Point 的引用,而不是 Point 本身。 - Louis Wasserman
1
因为Java是按值传递的。 - Sotirios Delimanolis
1
这里有更好的解释:Java是按引用传递吗? - Luiggi Mendoza
1个回答

4
传递给initializeToken的Point p是存储在内存中的实例的本地引用。当您调用p.setLocation()时,您正在“取消引用”p,即修改内存中的实际实例。但是,如果您只是设置p = new Point(x, y),那么您正在修改initializeToken方法中的局部变量,该变量在方法终止时将消失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接