Как присвоение Java может быть сделано указать на объект вместо того, чтобы делать копию?

В классе я имею:

private Foo bar;
public Constructor(Foo bar)
{
    this.bar = bar;
}

Вместо того, чтобы создать копию панели от объекта, обеспеченного в параметре, действительно ли возможно включать указатель на панель в конструкторе, таким образом, что изменение исходной панели изменяет поле в этом объекте?

Другой способ поместить его:

int x = 7;
int y = x;
x = 9;
System.out.print(y); //Prints 7.

Возможно настроить его так, чтобы печать y распечатала 9 вместо 7?

10
задан leonbloy 5 May 2010 в 19:30
поделиться

5 ответов

Ваш последний пример работает именно так, потому что int является примитивом, он копируется по значению. В первом примере « this.bar » будет содержать копию ссылки (своего рода указатель) на bar . Поэтому, если вы измените исходную полосу (внутренне), изменение отразится на вашем классе. Попытайся.

8
ответ дан 3 December 2019 в 15:35
поделиться

Чтобы сохранить исходное значение элемента bar, вам необходимо реализовать интерфейс Cloneable. Затем, прежде чем присвоить объекту новое значение, вам нужно будет сделать его клон, передать клонированное значение и присвоить новые значения клонированному объекту. Вот руководство о том, как это сделать http://www.java-tips.org/java-se-tips/java.lang/how-to-implement-cloneable-interface.html .

0
ответ дан 3 December 2019 в 15:35
поделиться

Чтобы добиться такого поведения, вы можете изменить член объекта:

public class Number{
  int value;
  Number(int value){
    this.value = value;
  }
  public String toString() {
    return "" + value;
  }
}

Затем вы можете сделать:

Number x = new Number(7);
Number y = x;
x.value = 9;
System.out.println(y);//prints 9
3
ответ дан 3 December 2019 в 15:35
поделиться

Java никогда не копирует объекты. Проще всего думать об этом в терминах: для каждого "нового" у вас будет один экземпляр объекта - и никогда больше.

Люди становятся РЕАЛЬНО запутанными, когда обсуждают это в терминах передачи по ссылке/передачи по значению, если вы не очень хорошо знакомы с тем, что означают эти термины, я предлагаю вам игнорировать их и просто помнить, что Java никогда не копирует объекты.

Таким образом, java работает именно так, как вы хотели, чтобы работал ваш первый пример, и это основная часть ОО-дизайна - тот факт, что после инстанцирования объекта он является одним и тем же объектом для всех, кто его использует.

Работа с примитивами и ссылками немного отличается - поскольку они не являются объектами, они всегда копируются - но чистый эффект заключается в том, что java почти всегда делает то, что вы хотите, без лишнего синтаксиса или запутанных опций.

1
ответ дан 3 December 2019 в 15:35
поделиться

Когда переменная используется в качестве аргумента метода, ее содержимое всегда копируется . (В Java есть только вызов по значению .) Здесь важно понимать, что вы можете только ссылаться на объекты через ссылки. Итак, что на самом деле происходит, когда вы передаете переменную, ссылающуюся на объект, так это то, что вы передаете ссылку на объект (по значению!).

Кто-то может сказать вам, что «примитивы передаются по значению» и «не примитивы передаются по ссылке», но это просто потому, что переменная никогда не может содержать объект с самого начала, только ссылку на объект. Когда этот кто-то поймет это, он согласится, что даже переменные, относящиеся к объектам, передаются по значению.

Из Является ли Java «передачей по ссылке» или «передачей по значению»?

Java всегда является передачей по значению. Трудно понять, что Java передает объекты как ссылки, передаваемые по значению.

Из http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Java действительно управляет объектами по ссылке, и все объектные переменные являются ссылками. . Однако Java не передает аргументы метода по ссылке; он передает их по значению.

В Java не существует аналога "ссылочного типа" C ++ для примитивов.

16
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: