![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Имеем такой код:
Других объектов класса MyObject не создается. По моим представленям у новый объкт myObject получит уже присвоенные значения статических переменных т.к. должен быть создан объект (правая сторона оператора №5), а уже потом заменена ссылка на старый объект (само присвоение). Хотелось бы узнать прав ли я. Если не прав - легко нарваться на мерцающую ошибку. Типа успел garbage collector - не успел garbage collector. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| SaSho |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 10.6.2007 Где: Днепропетровск Репутация: 2 Всего: 3 |
Начнём с того, что значения статических переменных "получит" не объект myObject, а класс MyObject, статические переменные - это переменные класса, а не конкретного экземпляра, их значения в каждый момент времени одинаковы для всех объектов класса. Т.о. эти значения будут одинаковы для всех экземпляров класса MyObject - и для созданного в строке 1, и в строке 5.
Вот только какие это значения присваиваются статическим переменным? Возможно, следует обойтись без них? |
|||
|
||||
| Dummy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
Никакого мерцания со статическими переменными не будет. Статические переменные могут сбросить присвоенные им в значения только при выгрузке и повторной загрузке класса, но согласно JLS, класс не выгружается, пока достижим его загрузчик, читай - пока достижим хотя бы один из загруженных этим загрузчиком классов.
В твоем случае - пока в программе будет достижимая ссылка на MyObject, за статические поля можно не беспокоиться. |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
SaSho, не могу не съязвить.
Dummy, это понятно. Вопрос в том и заключается - а не производит ли JVM такое присвоение по какому-нибудь своему разумению; т.е. не может ли получиться, что в какой-то физический момент выполнения опрератора №5 ни старый, ни новый объект не будет достижим? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Я тоже не понимаю смысла вопроса, если предположить, что человек знает про статические члены.
Что имеется в виду? Никаких ссылок на ОБЪЕКТЫ типа MyObject в программе может вообще не быть, а статические переменные всё равно будут доступны и никуда не будут пропадать. Можно создать класс, в котором либо нет конструктора, либо он приватный, то есть, чтобы создавать его объекты было в принципе невозможно. И всё равно в таком классе можно завести статические члены, которыми можно будет пользоваться. |
||||
|
|||||
| Dummy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
Верно. И обратного я не утверждал. Наверное, объяснил невнятно... Попробую изложить по порядку, как я понимаю суть проблемы. Вопрос Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject, JVM просто выгружает класс MyObject, в результате чего значения статических полей при повторной загрузке класса сбрасывается в значения по умолчанию. Ответ (общий) Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader, которым этот класс был загружен. Это возможно только в том случае, когда недостижимыми станут ВСЕ классы, загруженные с помощью данного ClassLoader. При выполнении этих условий выгрузка класса может произойти только в тот момент, когда в программном коде просто не останется достижимых мест, откуда можно было бы взять значение, например, статической переменной этого класса. Пример Для простоты предположим, что MyObject - это единственный класс, загруженный с помощью данного ClassLoader. Тогда класс MyObject можно выгрузить в следующем случае:
Но так как до конца объяснения выше немногие cмогут бодрствовать, я привел Ответ (частный) В приведенном примере выгрузка невозможна хотя бы по той простой причине, что в течение всего исполнения этого кода существуетпеременная-ссылка типа MyObject , а это означает, что класс MyObject достижим. |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Dummy, спасибо. Теперь все ясно.
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки На мой взгляд, это, хоть и интересный, но излишне сложный ответ для данного случая. Даже не зная ничего ни про какие класслоадеры, просто из практики использования статических объектов, ясно, что они никуда не пропадают вне зависимости от того, существуют или нет экземпляры классов. Например, мы используем объект System.out и никогда не заботимся о том, чтобы существовали объекты типа System. Точно так же мы используем методы и поля внутри Math. И никогда никакие статические члены никуда не пропадали. |
|||
|
||||
| Dummy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
Да, общий ответ заморочен и для такого простого случая достаточно частных пояснений, хотя замечу, что доказательство вида "сто раз пробовали и ничего никуда не пропадало" пытливый ум не устроят (вдруг на 101-й раз не сработает), в идеале хочется дедуктивного объяснения, почему так Почему же. Может быть, приведенный пример действительно не самый удачный, но суть вопроса может быть интересна любителям покопать JVM внутрь _Y_, закрой, пожалуйста, тему, если тебя устраивает полученный ответ. Это сообщение отредактировал(а) Dummy - 10.10.2008, 12:50 |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? Почему не предположить, например, что когда нет ни одного объекта, то уничтожается вообще вся виртуальная машина? Или не перегружается компьютер? А вдруг, пока значение вычислено, но ещё не заложено в переменную, может Вселенная схлопнуться? |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Честно говоря, из опыта работы с другими языками. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
О! А с какими, если не секрет? Интересуюсь сравнением различных языков...
|
|||
|
||||
| Dummy |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
Выгрузка классов - одна из функций JVM по сокращению объема используемой ей памяти. Читали те документы, на которые я указал? И хоть про коллапс Вселенной там ни слова, такое действие, как выгрузка классов, там описано. В том числе описаны правила, которым должна подчиняться выгрузка, чтобы избежать проблем, которые волнуют автора топика. Это сообщение отредактировал(а) Dummy - 10.10.2008, 21:52 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |