|
|
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста новичку разобраться ) я что-то совсем запутался... вот цитата из книги которую я читаю ( там используется 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. Если скомпилировать и запустить этот код, то на консоль выведется следующее : консоль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" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 23:39:27 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
авторИ если да, то что тогда в книге написано ?как один из вариантов: бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 23:48:54 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Все правильно работает : x1.ob1 ссылается на объект (назовем его @ob1) после клонирования x2.ob1 ссылается на объект @ob1 после чего здесь x2.ob = 100; происходить автоматическая упаковка примитива в ссылочный тип - в куче создается новый объект (назовем его @obj2) и получается что x1.ob1 ссылается на @ob1 а x2.ob2 на @ob2. В случае же со String все ще проще - стринг immutable то есть x2.str = "AAA снова же инициализирует ссылку str. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 00:27:33 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
someone1 а что тогда в книге написано ? (( someone1В случае же со String все ще проще - стринг immutable то есть x2.str = "AAA снова же инициализирует ссылку str. т.е. скажем вот такой код : Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 13:57:57 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Да - будет создано три объекта, а сборщик мусора когда надо будет удалит (а может и не удалит если памяти хватает). В книге все правильно написано - например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 15:17:01 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
о, так работает как в книге )) спасибо за помощь) Т.е. со Стрингом не получалось потому что Стринг - неизменяемый объект ?? И еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 17:08:37 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Дело не в изменяемости/неизменяемости - дело в том что ты в первом случае заново инициализируешь ссылку а во втором меняешь значение в объекте (значение примитива) на который ссылаются ссылки клонируемого объекта и клона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 17:52:57 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
PrimaxИ еще вопрос, а классы простых типов ( Integer, Double, etc.) - тоже неизменяемые ? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 17:54:16 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
someone1Дело не в изменяемости/неизменяемости - дело в том что ты в первом случае заново инициализируешь ссылку а во втором меняешь значение в объекте (значение примитива) на который ссылаются ссылки клонируемого объекта и клона. ээ...чтот я не очень тебя понял (((( В первом случае - это где ? это : Код: plaintext 1. 2. и второй случай это : Код: plaintext 1. 2. 3. Объясни пожалуйста ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 19:17:27 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
В первом случае это в твоем примере - во втором случае - это в моем примере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 21:13:03 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Тогда как я заново инициализирую ссылку ? ( Я совсем запутался ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2007, 01:02:39 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Забавно, но в JDK 1.6 интерфейс Cloneable не содержит ни одного метода. ---------------- С уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2007, 12:25:46 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
Вот так: x2.ob = 100; //new Integer(100); x2.str = "AAA"; Хм - а разве в 1.4 были какие-то методы у Cloneable ? Начиная с 5 он же вроде только дженерик стал и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2007, 12:44:26 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
"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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2007, 12:45:06 |
|
||
|
Клонирование
|
|||
|---|---|---|---|
|
#18+
someone1Вот так: x2.ob = 100; //new Integer(100); x2.str = "AAA"; а как тогда изменить тот пример, чтобы ссылка заново не инициализировалась, а просто меняла значение на объекте, куда указывает и ссылка-клон и первоначальная ссылка ?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2007, 19:19:17 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34630580&tid=2145275]: |
0ms |
get settings: |
20ms |
get forum list: |
22ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
56ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 335ms |
| total: | 526ms |

| 0 / 0 |
