Назначение значений ссылочному экземпляру


Я являюсь промежуточным новичком 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 );
  }
}      
Этот код модифицирован в образовательных целях (я пытаюсь понять это). Оригинальный код взят из книги "Java ist auch eine Insel" Криситана Улленбума.

Хорошо, теперь есть этот метод intializeToken и я передаю экземпляр класса Point . (Я надеюсь, что правильно понял, поэтому, если я ошибусь, пожалуйста, не стесняйтесь поправлять меня.) Когда этот метод вызывается главным методом, новая ссылка на - скажем - экземпляр playerPosition создается точкой P. Теперь, поскольку параметр playerPosition, который передается методу initializeToken, не является окончательным, я могу сделать любое назначение точке p , что я хотеть.

Но когда я создаю новый точечный объект с опорной переменной x и назначаю эту ссылку p по p = x; положение x и y playerPosition не изменится, но по p.setLocation() это происходит.

Может ли кто-нибудь сказать мне, почему?
1 3

1 ответ:

Точка p, переданная в initializeToken, является локальной ссылкой на экземпляр p, хранящийся в памяти. Когда вы вызываете p. setLocation (), вы "разыменовываете" p, то есть изменяете фактический экземпляр в памяти. Однако если вы просто зададите p = new Point (x, y), вы измените локальную переменную в методе initializeToken, которая исчезнет, как только метод завершится.