Я застрял в этом очень долгое время.Clone() корпус для глубокого клонирования?
скажите, если следующий код делает клон или нет?
class A
{
int i;
int j;
String str;
A()
{
i=10;
j=30;
str="Hello";
}
A(A a)
{
this.i=a.i;
this.j=a.j;
this.str=a.str;
}
}
class B
{
public static void main(String args[])
{
A a = new A();
A a1 = new A(a);
/* I want to make clone like this. */
}
}
, когда я запускаю этот код, и когда я печатаю hashcode a и a1, они разные. Но некоторые из моих друзей говорят, что это не правильный способ сделать клон. Вы должны реализовать интерфейс Cloneable, действительно ли это необходимо? На мой взгляд, это может быть хороший подход, если я хочу сделать глубокую копию даже в случае производной ссылочной переменной. Спасибо.
Ваш код не делает глубокую копию или даже мелкую копию ('str' отличается). Вы действительно хотите получить глубокую копию? Кроме того, ваши друзья правы; то, что у вас есть, называется _copy constructor_. Это совершенно прекрасный стиль кодирования. Кроме того, если вы не реализуете 'hashcode()', вы должны ожидать, что отдельные объекты будут иметь разные хэш-коды. –
Мой код отлично делает глубокую копию. значения всех полей одинаковы. Да, это конструктор копирования, который выполняет глубокую копию. 'И, очевидно, я не переопределяю hashcode(), поэтому я не буду получать одинаковые хэш-коды. Но почему, по вашему мнению, он делает глубокую копию? –
Во-первых, вы изменили свой код, так как я разместил свой комментарий, поэтому часть моего комментария теперь не имеет значения. Он делает копию _shallow_. Однако, если вам нужна глубокая копия, вам нужно будет сделать это. This.str = new String (a.str) '. Поскольку String неизменен, это совсем неважно, но это тоже не глубокая копия. –