powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Клонирование
16 сообщений из 16, страница 1 из 1
Клонирование
    #34629858
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите пожалуйста новичку разобраться ) я что-то совсем запутался...
вот цитата из книги которую я читаю ( там используется jdk 1.4 ) :
bookКлонирование - потенциально опасное действие, потому что оно может вызывать непреднамеренные побочные эффекты. Например, если имитируемый объект содержит ссылочную переменную с именем obRef, то, когда клон сделан, obRef в клоне обратится к тому же объекту, что и obRef в оригинале. Если клон выполняет изменение содержимого объекта, на который ссылается obRef, то будет также изменен и оригинальный объект. Другой пример : если объект открывает поток ввода\вывода и затем клонируется, то оба объекта будут способны действовать на одном и том же потоке. Далее, если один из этиъ объектов закрывает поток, другой мог бы все еще пытаться записывать в него, вызывая ошибку

И вот пример кода небольшого :

Код: plaintext
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.
 public   class  MyClass  implements  Cloneable {

     int  a;
     double  b;
    Integer ob;
    String str;

     public   static   void  main(String[] args) {
        MyClass x1 =  new  MyClass();
        
        x1.a =  5 ;
        x1.b =  10 . 58 ;
        x1.ob =  2 ;
        x1.str = "test";        
        
        MyClass x2;
         try  { x2 = (MyClass)x1.clone(); }  catch (Exception e) {  return ; }
        
        x2.a =  23 ;
        x2.ob =  100 ;
        x2.str = "AAA";
        
        System.out.println("x1.a = " + x1.a + " ; x1.b = " + x1.b + " ; x1.INTEGER = " + x1.ob + " ; Stroka = " + x1.str);
        System.out.println("x2.a = " + x2.a + " ; x2.b = " + x2.b + " ; x2.INTEGER = " + x2.ob + " ; Stroka = " + x2.str);                
    }
}

Если скомпилировать и запустить этот код, то на консоль выведется следующее :
консольx1.a = 5 ; x1.b = 10.58 ; x1.INTEGER = 2 ; Stroka = test
x2.a = 23 ; x2.b = 10.58 ; x2.INTEGER = 100 ; Stroka = AAA

Но я ожидал увидеть такое :
консольx1.a = 5 ; x1.b = 10.58 ; x1.INTEGER = 100 ; Stroka = AAA
x2.a = 23 ; x2.b = 10.58 ; x2.INTEGER = 100 ; Stroka = AAA

Скажите пожалуйста, что именно происходит при клонировании ? Создается точная копия объекта, которая никак не связана с оригиналом, и при изминении клона первоначальный объект остается неизменным ( что выдает Java ) ? И если да, то что тогда в книге написано ? (((

ЗЫ книга - П.Ноутон, Г.Шилдт "JAVA 2"
...
Рейтинг: 0 / 0
Клонирование
    #34629862
авторИ если да, то что тогда в книге написано ?как один из вариантов: бред.
...
Рейтинг: 0 / 0
Клонирование
    #34629882
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно работает :
x1.ob1 ссылается на объект (назовем его @ob1)
после клонирования
x2.ob1 ссылается на объект @ob1
после чего здесь x2.ob = 100;
происходить автоматическая упаковка примитива в ссылочный тип - в куче создается новый объект (назовем его @obj2) и получается что x1.ob1 ссылается на @ob1 а x2.ob2 на @ob2.
В случае же со String все ще проще - стринг immutable то есть x2.str = "AAA снова же инициализирует ссылку str.
...
Рейтинг: 0 / 0
Клонирование
    #34630131
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someone1
а что тогда в книге написано ? ((


someone1В случае же со String все ще проще - стринг immutable то есть x2.str = "AAA снова же инициализирует ссылку str.
т.е. скажем вот такой код :
Код: plaintext
1.
2.
3.
String str;
str = "aaa";
str = "bbb";
str = "ccc";
т.е. всего будет создано три объекта String ? Но ссылочная переменная str в данном случае в конце будет указывать на последний объект ("ccc"), а остальные два сборщик мусора удалит из памяти ?
...
Рейтинг: 0 / 0
Клонирование
    #34630178
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да - будет создано три объекта, а сборщик мусора когда надо будет удалит (а может и не удалит если памяти хватает). В книге все правильно написано - например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 public   class  MyClass  implements  Cloneable {
    Mutable objRef;
     public  MyClass(Mutable objRef){ this .objRef=objRef;}
     public  Mutable getRef(){ return  objRef;}
}

 class  Mutable {
 private   int  value;
//... getters/setters
}

..
 public   static   void  main(String[] args){
Mutable mt= new  Mutable();
mt.setValue( 1 );
MyClass mc1= new  MyClass(mt);
System.out.println(mc1.getRef().getValue());
MyClass mc2=(MyClass)mc1.clone();
System.out.println(mc2.getRef().getValue());
mc2.getRef().setValue( 2 );

System.out.println(mc1.getRef().getValue()); //2
System.out.println(mc2.getRef().getValue()); //2
}
...
Рейтинг: 0 / 0
Клонирование
    #34630239
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, так работает как в книге )) спасибо за помощь)
Т.е. со Стрингом не получалось потому что Стринг - неизменяемый объект ??
И еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ?
...
Рейтинг: 0 / 0
Клонирование
    #34630268
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в изменяемости/неизменяемости - дело в том что ты в первом случае заново инициализируешь ссылку а во втором меняешь значение в объекте (значение примитива) на который ссылаются ссылки клонируемого объекта и клона.
...
Рейтинг: 0 / 0
Клонирование
    #34630270
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PrimaxИ еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ? да
...
Рейтинг: 0 / 0
Клонирование
    #34630323
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someone1Дело не в изменяемости/неизменяемости - дело в том что ты в первом случае заново инициализируешь ссылку а во втором меняешь значение в объекте (значение примитива) на который ссылаются ссылки клонируемого объекта и клона.
ээ...чтот я не очень тебя понял ((((
В первом случае - это где ? это :
Код: plaintext
1.
2.
MyClass x2;
         try  { x2 = (MyClass)x1.clone(); }  catch (Exception e) {  return ; }

и второй случай это :
Код: plaintext
1.
2.
3.
x2.a =  23 ;
        x2.ob =  100 ;
        x2.str = "AAA";
???
Объясни пожалуйста (
...
Рейтинг: 0 / 0
Клонирование
    #34630367
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом случае это в твоем примере - во втором случае - это в моем примере.
...
Рейтинг: 0 / 0
Клонирование
    #34630455
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда как я заново инициализирую ссылку ? ( Я совсем запутался (
...
Рейтинг: 0 / 0
Клонирование
    #34630570
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно, но в JDK 1.6 интерфейс Cloneable не содержит ни одного метода.

----------------
С уважением
...
Рейтинг: 0 / 0
Клонирование
    #34630579
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так:
x2.ob = 100; //new Integer(100);
x2.str = "AAA";

Хм - а разве в 1.4 были какие-то методы у Cloneable ? Начиная с 5 он же вроде только дженерик стал и все.
...
Рейтинг: 0 / 0
Клонирование
    #34630580
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"public interface Cloneable

A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class. "
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Cloneable.html
...
Рейтинг: 0 / 0
Клонирование
    #34630782
Primax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someone1Вот так:
x2.ob = 100; //new Integer(100);
x2.str = "AAA";

а как тогда изменить тот пример, чтобы ссылка заново не инициализировалась, а просто меняла значение на объекте, куда указывает и ссылка-клон и первоначальная ссылка ?..
...
Рейтинг: 0 / 0
Клонирование
    #34630835
someone1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том примере никак т.к выше было скзаано String, Byte,Integer и т.п не имею методов для изменения.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Клонирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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