Объект Клон Мелкая копия не меняет переменную - PullRequest
1 голос
/ 23 марта 2012

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

    CloneExample obj1=new CloneExample();
    CloneExample obj2=(CloneExample) obj1.clone();
    obj1.a=2;
    obj1.c='a';
    System.out.println("obj1 real "+obj1.a+" "+obj1.c);
    System.out.println("obj2 real "+obj2.a+" "+obj2.c);
    obj2.a=99;
    obj2.c='z';
    System.out.println("obj2 after change "+obj2.a+" "+obj2.c);
    System.out.println("obj1 after change "+obj1.a+" "+obj1.c);
    System.out.println("obj1="+obj1+" obj2="+obj2);

Если этот клон является мелкой копией, то obj2 и Obj1 указывают на одну и ту же ссылочную obj, изменение obj2 должно отражаться в obj1. Так не бывает Может ли кто-нибудь объяснить (я понимаю, что клон предназначен для того, чтобы дать нам копию объекта, но если это мелкая копия, тогда зачем нам нужна мелкая копия? Спасибо.

Ответы [ 3 ]

4 голосов
/ 23 марта 2012

Мелкая копия obj1 создает другой экземпляр obj2 вашего класса CloneExample (obj1! = Obj2). Они не разделяют ценностных членов.

Но если наш класс содержит ссылочный тип, например, java.util.Date, то изменение его значения будет отражено в обоих объектах, если они будут использовать общую ссылку на этот java.util.Date.

Что такое мелкая копия на Java?

3 голосов
/ 23 марта 2012

почему вы думаете, что клон является мелкой копией?смотрите здесь: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()

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

0 голосов
/ 23 марта 2012

Когда вы вызываете object.clone (), создается новый объект. В результате вы получаете ссылку на этот объект. Объект с только примитивным типом поля клонируется идеально. В результате вы получаете полную независимость от вашей копии obj1. Но если у вашего объекта есть поля со ссылками, вам необходимо выполнить глубокое клонирование.

...