I thought I can modify items inside the copiedInvoice and it will not affect these itmes inside originalInoice.
Это происходит потому, что получает скопирована является ссылочной переменной, а не объект это сам.
Следовательно, вы получаете две «ссылки», указывающие на один и тот же объект.
Если вам нужно скопировать весь объект, вам может понадобиться клонировать его.
Но у вас могут быть проблемы, если вы не клонируете внутренние атрибуты объекта, если они являются другими объектами.
Например, следующее определение класса не даст вам никаких проблем.
public class Something {
private int x;
private int y;
private String stringObject;
}
Если вы создадите копию этого файла, скопируйте текущие значения его атрибутов и все.
Но если у вашего класса есть другой объект внутри, вы можете также его клонировать.
class OtherSomething {
Something something;
private int x;
}
Если вы выполните следующие действия:
Something shared = new Something();
OtherSomething one = new OtherSomething();
OtherSomething two = new OtherSomething();
one.something = shared;
two.something = shared;
В этом случае, как один и два имеют одинаковую ссылочную переменную с тем же общим «что-то» и изменение значения в один будет влиять на других ,
Вот почему это намного проще/лучше/проще использовать неизменяемые объекты.
Если вам нужно изменить значение неизменяемого объекта, вы просто создаете новый с правильным значением.
Возможный дубликат: http://stackoverflow.com/questions/715650/java-how-to-clone-arraylist-but-also-clone-its-items как упоминается Zed. –
Я закрываю это как дубликат, но его не следует удалять. Не все будут знать, чтобы искать, используя технически правильную терминологию «клон», которую использует оригинал. –