powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
7 сообщений из 7, страница 1 из 1
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465031
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Почему для этого примера:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
import static java.lang.System.*;
import java.math.*;
class ArrCloneTest01 {
  public static void main(String[] aa) {
    new ArrCloneTest01().go();
  }
  void go() {


    // .......................
    BigInteger[] ba = { new BigInteger("10"), new BigInteger("20"), new BigInteger("30") }; // autoboxing
    BigInteger[] bb = ba.clone();
    ba[2]=new BigInteger("11");

    out.println("\nba[]: "+ba);
    for(BigInteger x:ba) out.println(x);

    out.println("\nbb[]: "+bb);
    for(BigInteger x:bb) out.println(x);

    out.println("\n---------");
    
    // ......................

    Element[] ea = { new Element(10), new Element(20), new Element(30) };
    ea[0].name="Ne";
    ea[1].name="Ca";
    ea[2].name="Zn";
    Element[] eb = ea.clone();

    ea[2].mass=79;
    ea[2].name="Au";

    out.println("\nea[]: "+ea);
    for(Element x:ea) out.println(x);

    out.println("\neb[]: "+eb);
    for(Element x:eb) out.println(x);

  }
  static class Element{
    private int mass;
    private String name="element";
    Element(int m) { mass = m; }
    public String toString() { return name+" "+mass; }
  }
}

- вывод выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ba[]: [Ljava.math.BigInteger;@18a992f
10
20
 11 

bb[]: [Ljava.math.BigInteger;@1fc4bec
10
20
 30 

---------

ea[]: [LArrCloneTest01$Element;@1bab50a
Ne 10
Ca 20
 Au 79 

eb[]: [LArrCloneTest01$Element;@c3c749
Ne 10
Ca 20
 Au 79 

То есть, вопрос простой: чем принципиально отличается массив BigInteger'ов от массива пользовательского класса Element, что клонирование их идёт по-разному ?

Дока говорит:Object.clone()this method creates a new instance of the class of this object and initializes all its fields with exactly the content s of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned . Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation. Извините, но ЯНХНП!
С одной стороны, утверждается, что создаётся НОВЫЙ ИНСТАНС и все его поля заполняются "with exactly the contents" (блин, как правильно перевести ?...) соотв-щих полей объекта-источника. Но тут же говорится, что содержимое полей НЕ клонируется.

Пролейте свет кто-нибудь, плз.... %-/
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465039
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,
там же буквально написано, что было в поле которое вы клониурете, ровно то и будет в поле созданного инстанса.
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465047
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оригинал
Код: plaintext
1.
2.
3.
A{
  B{ C, D }
  E{ F, G }
}
shallow copy
Код: plaintext
1.
2.
3.
A1{
  B{ C, D }
  E{ F, G }
}
deep copy
Код: plaintext
1.
2.
3.
A1{
  B1{ C1, D1 }
  E1{ F1, G1 }
}
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465087
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне непонятно, почему с BigInteger-массивом "всё не так". Там клонирование что, глубокое ?
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465096
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,
что непонятного? массивы бигинтегеров после клонирования разные , но элементы в них одинаковые . в одном из массивов вы заменили один их элементов. Увидели закономерный результат.
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465101
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisМне непонятно, почему с BigInteger-массивом "всё не так". Там клонирование что, глубокое ?
В примере с BigInt вы меняете элемент второго уровня: B, E, поэтому он меняется только у одного из массивов.
Т.е. меняется ссылка - элемент массив. У каждого массива свои элементы.

В примере с Element меняется третий уровень - (C, D, F, G)
В данном случае оба массива ссылаются на один и тот же элемент 2го уровня. Меняется один объект. Оба массива ссылаются на один объект. Оба "видят" изменения.

Принципиальная разница в том что BigInteger - immutable тип, а Element - mutable. Вы их по разному используете.
К вопросу клонирования это вообще отношения не имеет.

В первом
ba[2]=new BigInteger("11");
Во втором
ea[2].name="Zn";
А должно быть
ea[2] = new Element();
...
Рейтинг: 0 / 0
clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
    #38465117
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker, как раз этого я и не понимал.
Blazkowicz, спасибо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / clone() массива объектов: не понимаю, когда копирует элементы, а когда только ссылки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]