Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Клонирование / 16 сообщений из 16, страница 1 из 1
29.06.2007, 23:39:27
    #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
29.06.2007, 23:48:54
    #34629862
Клонирование
авторИ если да, то что тогда в книге написано ?как один из вариантов: бред.
...
Рейтинг: 0 / 0
30.06.2007, 00:27:33
    #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
30.06.2007, 13:57:57
    #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
30.06.2007, 15:17:01
    #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
30.06.2007, 17:08:37
    #34630239
Primax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
о, так работает как в книге )) спасибо за помощь)
Т.е. со Стрингом не получалось потому что Стринг - неизменяемый объект ??
И еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ?
...
Рейтинг: 0 / 0
30.06.2007, 17:52:57
    #34630268
someone1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
Дело не в изменяемости/неизменяемости - дело в том что ты в первом случае заново инициализируешь ссылку а во втором меняешь значение в объекте (значение примитива) на который ссылаются ссылки клонируемого объекта и клона.
...
Рейтинг: 0 / 0
30.06.2007, 17:54:16
    #34630270
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
PrimaxИ еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ? да
...
Рейтинг: 0 / 0
30.06.2007, 19:17:27
    #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
30.06.2007, 21:13:03
    #34630367
someone1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
В первом случае это в твоем примере - во втором случае - это в моем примере.
...
Рейтинг: 0 / 0
01.07.2007, 01:02:39
    #34630455
Primax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
Тогда как я заново инициализирую ссылку ? ( Я совсем запутался (
...
Рейтинг: 0 / 0
01.07.2007, 12:25:46
    #34630570
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
Забавно, но в JDK 1.6 интерфейс Cloneable не содержит ни одного метода.

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

Хм - а разве в 1.4 были какие-то методы у Cloneable ? Начиная с 5 он же вроде только дженерик стал и все.
...
Рейтинг: 0 / 0
01.07.2007, 12:45:06
    #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
01.07.2007, 19:19:17
    #34630782
Primax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клонирование
someone1Вот так:
x2.ob = 100; //new Integer(100);
x2.str = "AAA";

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


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