Как java clone () действительно использует поверхностное копирование? - PullRequest
0 голосов
/ 02 сентября 2018

Я знаю, что это может быть уже задано, но мой вопрос - это что-то другое. Я искал и знаю, что java метод object.clone() использует поверхностное копирование, что означает копирование ссылок, а не реальных объектов. Допустим, у меня есть собака Класс

 Class Dog{
     public Dog(String name, DogTail tail, DogEar ear){
          this.name = name;
          this.tail = tail;
          this.ear  = ear;   
     } 
} 
DogTail t = new DogTail(); 
DogEar ear = new DogEar(); 
Dog dog1 = new Dog("good", t,ear);

допустим, я хочу получить копию dog1.

Dog dognew = dog1.clone ();

Если этот метод clone() использует поверхностное копирование, это означает копирование ссылок. Поэтому, если я изменю t-объект, созданный выше, или метод ear, он изменится в dognew-объекте или наоборот. Как это клонирование хорошо? Этот вопрос возник, потому что кто-то сказал, что создание большого огромного объекта хуже, чем клонирование, поскольку вы экономите производительность при использовании метода clone().

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

"Итак, если я изменю t-объект, созданный выше, или метод ear, он изменится в dognew-объекте или наоборот."

Это зависит от того, что вы подразумеваете под «изменением» :

Если вы имеете в виду изменить состояние DogTail экземпляра, на который ссылается t, например, t.setSomething(someValue);, тогда да. Это тот же случай, не имеет значения, кто вызывает изменение или где оно происходит.

Если, однако, вы имеете в виду, измените значение t в ссылках на клоны, например, t = new DogTail();, t в оригинале не будет затронуто. t в клоне и оригинале будет ссылаться на разные экземпляры после этого.

0 голосов
/ 02 сентября 2018

Версия по умолчанию метода clone() создает поверхностную копию объекта.

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

Чтобы создать глубокую копию объекта, вы можете переопределить метод clone().

protected Object clone() throws CloneNotSupportedException
{
    DogTail tail = (DogTail) this.tail.clone();

    Dog dog = (Dog) super.clone();

    dog.tail = tail;

    return dog;
}
...