Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача статических значений обновленному объекту, старый объект заменяется новым 
V
    Опции темы
_Y_
Дата 9.10.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Имеем такой код:
Код

MyObject myObject = new MyObject();
.................. 
//Делаем что-то с myObject, что присваивает значения статическим переменным класса MyObject 
.....
myObject = new MyObject();

Других объектов класса MyObject не создается.

По моим представленям у новый объкт myObject получит уже присвоенные значения статических переменных т.к. должен быть создан объект (правая сторона оператора №5), а уже потом заменена ссылка на старый объект (само присвоение).

Хотелось бы узнать прав ли я. Если не прав - легко нарваться на мерцающую ошибку. Типа успел garbage collector - не успел garbage collector.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
SaSho
Дата 9.10.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 10.6.2007
Где: Днепропетровск

Репутация: 2
Всего: 3



Начнём с того, что значения статических переменных "получит" не объект myObject, а класс MyObject, статические переменные - это переменные класса, а не конкретного экземпляра, их значения в каждый момент времени одинаковы для всех объектов класса. Т.о. эти значения будут одинаковы для всех экземпляров класса MyObject - и для созданного в строке 1, и в строке 5.
Вот только какие это значения присваиваются статическим переменным? Возможно, следует обойтись без них?
PM MAIL ICQ Jabber   Вверх
Dummy
Дата 9.10.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



Никакого мерцания со статическими переменными не будет. Статические переменные могут сбросить присвоенные им в значения только при выгрузке и повторной загрузке класса, но согласно JLS,  класс не выгружается, пока достижим его загрузчик, читай - пока достижим хотя бы один из загруженных этим загрузчиком классов. 

В твоем случае - пока в программе будет достижимая ссылка на MyObject, за статические поля можно не беспокоиться. 
PM MAIL   Вверх
_Y_
Дата 9.10.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



SaSho, не могу не съязвить. smile  Как Вы думаете, человек не знающий того, что Вы написали задал бы такой вопрос?

Dummy, это понятно. Вопрос в том и заключается - а не производит ли JVM такое присвоение по какому-нибудь своему разумению; т.е. не может ли получиться, что в какой-то физический момент выполнения опрератора №5 ни старый, ни новый объект не будет достижим?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Dims
Дата 9.10.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(_Y_ @  9.10.2008,  18:56 Найти цитируемый пост)
Как Вы думаете, человек не знающий того, что Вы написали задал бы такой вопрос?

Я тоже не понимаю смысла вопроса, если предположить, что человек знает про статические члены.

Цитата(Dummy @  9.10.2008,  12:51 Найти цитируемый пост)
В твоем случае - пока в программе будет достижимая ссылка на MyObject, за статические поля можно не беспокоиться.  

Что имеется в виду? Никаких ссылок на ОБЪЕКТЫ типа MyObject в программе может вообще не быть, а статические переменные всё равно будут доступны и никуда не будут пропадать.

Можно создать класс, в котором либо нет конструктора, либо он приватный, то есть, чтобы создавать его объекты было в принципе невозможно. И всё равно в таком классе можно завести статические члены, которыми можно будет пользоваться.
PM MAIL   Вверх
Dummy
Дата 9.10.2008, 22:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



Цитата(Dims @  9.10.2008,  19:54 Найти цитируемый пост)
Что имеется в виду? Никаких ссылок на ОБЪЕКТЫ типа MyObject в программе может вообще не быть, а статические переменные всё равно будут доступны и никуда не будут пропадать.

Можно создать класс, в котором либо нет конструктора, либо он приватный, то есть, чтобы создавать его объекты было в принципе невозможно. И всё равно в таком классе можно завести статические члены, которыми можно будет пользоваться. 

Верно. И обратного я не утверждал. Наверное, объяснил невнятно... Попробую изложить по порядку, как я понимаю суть проблемы.

Вопрос Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject, JVM просто выгружает класс MyObject, в результате чего значения статических полей при повторной загрузке класса сбрасывается в значения по умолчанию.

Ответ (общий) Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader, которым этот класс был загружен. Это возможно только в том случае, когда недостижимыми станут ВСЕ классы, загруженные с помощью данного ClassLoader.

При выполнении этих условий выгрузка класса может произойти только в тот момент, когда в программном коде просто не останется достижимых мест, откуда можно было бы взять значение, например, статической переменной этого класса.

Пример Для простоты предположим, что MyObject - это единственный класс, загруженный с помощью данного ClassLoader. Тогда класс MyObject можно выгрузить в следующем случае:
  • не существует достижимых инстансов класса MyObject.
  • не существует других загруженных классов или достижимых объектов, которые бы хотя бы гипотетически использовали структуру класса MyObject каким-бы то ни было (ссылались на статические поля, статические функции или содержали ссылку типа MyObject).

Но так как до конца объяснения выше немногие cмогут бодрствовать, я привел

Ответ (частный) В приведенном примере выгрузка невозможна хотя бы по той простой причине, что в течение всего исполнения этого кода существуетпеременная-ссылка типа MyObject , а это означает, что класс MyObject достижим.


PM MAIL   Вверх
_Y_
Дата 10.10.2008, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Dummy, спасибо. Теперь все ясно.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Dims
Дата 10.10.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(Dummy @  9.10.2008,  22:44 Найти цитируемый пост)
Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject

Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки smile

Цитата(Dummy @  9.10.2008,  22:44 Найти цитируемый пост)
Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader

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

Например, мы используем объект System.out и никогда не заботимся о том, чтобы существовали объекты типа System. Точно так же мы используем методы и поля внутри Math. И никогда никакие статические члены никуда не пропадали.
PM MAIL   Вверх
Dummy
Дата 10.10.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



Цитата(Dims @  10.10.2008,  12:12 Найти цитируемый пост)
На мой взгляд, это, хоть и интересный, но излишне сложный ответ 
для данного случая.

Да, общий ответ заморочен и для такого простого случая достаточно частных пояснений, хотя замечу, что доказательство вида "сто раз пробовали и ничего никуда не пропадало" пытливый ум не устроят (вдруг на 101-й раз не сработает), в идеале хочется дедуктивного объяснения, почему такsmile.
Цитата(Dims @  10.10.2008,  12:12 Найти цитируемый пост)
Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки smile

Почему же. Может быть, приведенный пример действительно не самый удачный, но суть вопроса может быть интересна любителям покопать JVM внутрьsmile 

_Y_, закрой, пожалуйста, тему, если тебя устраивает полученный ответ.

Это сообщение отредактировал(а) Dummy - 10.10.2008, 12:50
PM MAIL   Вверх
Dims
Дата 10.10.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(Dummy @  10.10.2008,  12:48 Найти цитируемый пост)
в идеале хочется дедуктивного объяснения, почему так

Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Почему не предположить, например, что когда нет ни одного объекта, то уничтожается вообще вся виртуальная машина? Или не перегружается компьютер? А вдруг, пока значение вычислено, но ещё не заложено в переменную, может Вселенная схлопнуться? smile
PM MAIL   Вверх
_Y_
Дата 10.10.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Dims @ 10.10.2008,  18:57)
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Честно говоря, из опыта работы с другими языками.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Dims
Дата 10.10.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



О! А с какими, если не секрет? Интересуюсь сравнением различных языков...
PM MAIL   Вверх
Dummy
Дата 10.10.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



Цитата(Dims @  10.10.2008,  18:57 Найти цитируемый пост)
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Выгрузка классов - одна из функций JVM по сокращению объема используемой ей памяти. Читали те документы, на которые я указал? И хоть про коллапс Вселенной там ни слова, такое действие, как выгрузка классов, там описано. В том числе описаны правила, которым должна подчиняться выгрузка, чтобы избежать проблем, которые волнуют автора топика.

Это сообщение отредактировал(а) Dummy - 10.10.2008, 21:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0825 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.