![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Здравствуйте форумчане,
есть одна программа, которая активно использует static переменные, видимо лень было изначально выдумывать велосипед. Не важно, вторая копия этой же программы в VM хоть и запускается, но видимо когда то они начинают друг другу мешать и это убивает VM вместе с первой копией программы. Теперь вопрос, как запустить новую программу в той же VM, но так, чтобы и та и другая копия не воздействовали друг на друга, будто бы их запустили в разных VM. Чтобы их статические переменные действовали только на них. Да, я понимаю, что можно запустить отдельную VM через запуск java.exe -jar..... и так далее, но я не хочу запускать несколько java процессов, хочу всё в одном. И в догонку вопрос, который тоже к моей теме относится, можно ли в java обращаться к "родителям", короче говоря по древу, но в обратном направлении. То есть родитель может обратиться к дочернему объекту, через дочерний объект дальше к другому объекту, который этот дочерний объект создал и так далее. То есть от бабушек/дедушек, к папе/маме, к детям. А вот наоборот можно ли? То есть чтобы дети обращались к родительскому объекту, или через несколько "поколений" обратно. В данный момент я делаю так, что при создании объекта передаю ему "this" самого первичного объекта и по сути тогда уже могу через этого родителя доступаться. Но блин, это как то маразмовато получается, и если мне нужен только родитель объекта, а не его прапредок, то мне приходится обращаться к нему получается через несколько "поколений". Извинясюь, что использовал вот так такую аналогию с семейным древом, но лучшей возможности донести вопрос не представилось возможным. Просто учитывая, что это объектно ориентированный язык с унаследованием, я до сих пор не нашёл, как это делать, если такое вообще возможно. |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
По второму вопросу:
Может просто использовать слово super, указывающее класс-родитель? Или я не понял вопроса и надо, чтобы предок обращался к потомку? Тогда сложнее. Класс-родитель, по определению, ничего не знает и не должен знать о классах потомках. Даже само существование класса-потомка родительскому классу неизвестно. Поэтому решений обратных super не существует. Надо писать отдельный код для каждого конкретного случая. Это сообщение отредактировал(а) _Y_ - 6.11.2010, 14:04 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| nc30 |
|
|||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Или вы что-то хитрое придумали? Для расширения кругозора в ООП Это сообщение отредактировал(а) nc30 - 6.11.2010, 20:14 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Надо подумать, надо проверить,
а то что получается, что если super.super.method() это возвращаешься к праисточнику, или это только на один шаг назад можно?
Ну как раз таки иерархия объектов, ведь объект так или иначе образуется из класса.. я конечно могу на эту тему послушать заумную проповедь, но это будет опять расклад из области, чем отличается функция от метода, ведь зачем мне простые вещи усложнять пустозсвонством ps: я не говорю о доступе через extend классов, а именно объектов создающихся из классов по new... Это сообщение отредактировал(а) Viroman - 6.11.2010, 22:23 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Чтобы наверное было проще понять, что я хочу, приведу аналогию из JavaScript и Frame,
основная страница создаёт в себе фрэйм с вызовом страницы по аналогии объект здесь, далее эта фрейм страница создаёт следующий фрэйм указывая на другую страницу, опять же та же самая аналогия.. Теперь имеем дедушкa>папа>сын... опять же теперь, если я хочу из дедушки доступиться до функций папы, мне надо сказать, получи объект по имени папы>функция, далее чтобы доступиться из дедушки до внучика, мне надо сказать, получи объект по имени папы>получи объект по имени сына>функция и так далее, то есть эта аналогия в Java имеется бесспорно. Но на другой стороне имеем обратный путь по аналогии доступа к предкам. Чтобы из сына доступиться до дедушки, идёт вызов parent.parent.function() типа этого в общем.. Даже по доступу к файлам то же самое происходит, /../program.exe, или в том же PHP include /../../../site.php Вот теперь приведя вам такую аналогию стало понятнее? Вот на данный момент, чтобы в java доступиться от сына к дедушке, я при создании объекта папы передаю this дедушки, а потом от папы при создании объекта в нём передаю значение дедушки сыну. И тогда сын знает, кто его дедушка... но не знает, кто его папа, но поскольку это знает дедушка, то из сына я доступаюсь к папе через дедушку...но это маразм, ибо мне казалось, что ява разработчики тоже не дураки и должны были предусмотреть такой расклад, или нет? |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Viroman, судя по описанному сценарию, вам необходимо организовать объекты по принципу связного списка. наследование предназначено для других целей.
|
|||
|
||||
| Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Млин. Бабушки, дедушки...
У вас обькет А создает обьект Б и получает на него ссылку и так далее вглубь. Для доступа из А к Б вы используете эту ссылку. Если из Б нужно вызвать А, то вам нужно передать ссылку в экземпляр Б, т.е. this. Другого пути нет и быть не может. Пример, который вы привели из JavaScript ИМХО сюда не вписывается. Document, Window и прочие радости DOM это конкретные экземпляры вполне определенных классов http://w3schools.com/htmldom/default.asp. И то что они содержат ссылку parent вовсе не означает, что ЛЮБОЙ JavaScript обьект имеет сслыку на обьект, который его создал.
Если бы они это предусмотрели, вот это был бы маразм. Не хватало еще, что бы любой обьект мог дергать методы любого обьекта, который имел наглость его создать. Да еще и не на прямую, а через три п... колена... Добавлено через 8 минут и 20 секунд По поводу Как бы в отдельной ВМ. Опишите подробнее пожалуйста, как и что вы запускаете? Все static-переменные существуют в единственном экземпляре внутри одной VM. И ничего вы с этим не сделаете. Как вы там запускаете две копии программы в одном VM я не понимаю. Что такое "программа" в вашем контексте? И чем вам не нравится способ через java -jar ? |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Следует сказать, что Temdegon очень четко расписал. Я как-то сразу не въехал, что разговор, собственно, о получении одним объектом ссылки на другой. И наследование здесь совершенно не при чем.
Viroman, стОит, наверное, обратить внимание, что Java - язык довольно жестко структурированный (и даже идеологизированный Извиняюсь, если говорю очевидные вещи. Рано еще, воскресенье. Только проснулся -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Viroman |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
В общем я понял, что никто ничего не знает конкретно :(
Приведение аналогии не означало, что я говорю о тех же вещах.
Маразм как раз таки необходимость this передавать в объект, а будь подобное, это бы облегчило во многом создание програм, а особенно использование free source, где надо очень перелопатить многое, чтобы обмениваться данными. То есть если два объекта созданных через несколько поколений хотят обменяться данными, чтобы и их родительские объекты могли изменять данные и их "дети", то надо в детей через несколько поколений передавать ссылку, это надо перелопатить весь код, чтобы всё это выправить. Конечно, я могу static использовать, но это не подходит для запуска нескольких объектных инстанций. Вообще ваш спор больше исходит из твердолобости, нежели из маразматических изысканий, очень жаль конечно.
А что тут вам непонятного? Разжёвываю .. Запускаю так, java -cp "chuzhoj.jar,moj.jar" mojclass чтобы две машины не запускать, mojclass запускает иницальный класс из chuzhoj,jar, то бишь создавая объект начального класса с передачей в main метод необходимых параметеров с запуском из chuzhoj.jar, при этом два раза в отдельных threadах. Таким образом я в одной машине запускаю две копии программы, не запуская два java процесса.. во имя экономии памяти пользователя. Теперь понятно? Ах да, хуже дела обстоят, если энто дело запустить как апплет, ведь браузер запускает ява машину единожды и загружает программу, но там же наблюдаются те же проблемы, как только этот апплет под браузером запустить два раза, так сразу начинаются проблемы с параллельной работой программы описанные выше. В общем чую, простых решений не существует или просто как часто это очень бывает, никто ничего об этом не знает.. Это сообщение отредактировал(а) Viroman - 7.11.2010, 13:11 |
||||||
|
|||||||
| nc30 |
|
||||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Viroman,
Тут уже много уважаемых людей отозвалось по теме, но я еще раз кратко обозначу то, что хотел сказать (хотя надо было сделать это сразу, возможно удалось бы частично избежать последующих недоразумений и недопонимания). Слово "наследование" может быть воспринято не совсем правильно, если не относиться к нему здраво, как к удобной - да и то не всегда - абстракции. Слишком буквальные параллели из реальной жизни приведут к ошибочному восприятию. Да нет никакого наследования в Java. Есть расширение.
Путаница усиливается, если мы начнем абстракцию применимую к классам распространиять на объекты. Экземпляр класса-наследника по умолчанию включает в себя поля и методы предка (кроме private, конечно). Для обращения к ним не нужен никакой this и прочие ухищрения. Если мы говорим о наследовании по отношению к объектам, то забудьте о бабушках/дедушках - это звучит курьезно. Ибо правнук включает в себя прадедушку, дедушку и папу А если прав powerOn, и вы изобрели односвязный список (можете легко обратиться к "потомку", но проблемы достучаться до "предка"), то просто сделайте его двусвязным, и все должно получиться. А еще лучше, полагаю, воспользоваться подходящей для вашего случая коллекцией, например, LinkedList.
Ну что вы, какой из меня проповедник. А если я чем-то вас задел (о чем делаю вывод по использованным вами терминам), то искренне прошу прощения Да, и еще. Написав это
Полагаю, это позволит уважаемым участникам быстрее вникнуть в суть вашей проблемы и оказать посильную помощь. А также, что немаловажно, сэкономить свое и ваше время. Код в студию! Это сообщение отредактировал(а) nc30 - 7.11.2010, 16:19 |
||||||
|
|||||||
| jk1 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Никаких объектов создавать не надо. Метод main статический, это значит что вызывать его можно (и нужно) у класса, а не объекта.
Таким образом Вы запускаете две копии кода, который при написании на это не был рассчитан. Единственный способ устранить это концептуальное противоречие - запуск в двух разных JVM. Вообще говоря, чтобы код можно было использовать в нескольких потоках, он должен быть Thread-safe. Очень наивно с Вашей стороны предполагать, что произвольный код, запущенный в разных потоках будет адекватно себя вести. Для работы в многопоточном окружении любой код должен удовлетворять многим требованиям, это Вам подтвердит любое руководство по параллельному программированию.
Скажите, а Вам не приходило в голову, что языки программирование создаются на основании многих десятков лет опыта создания программ? Если некий концепт в язык не включен, значит он там не нужен. Авторы языка считали, что такие задачи надо решать другими средствами. Вы этим недовольны? Так выберите себе другой язык и не сотрясайте попусту воздух. Об обмене информацией: описанный Вами способ очень быстро заводит в тупик. Хотите передавать информацию между объектами далеких друг от друга классов? Используйте шаблон проектирования Observer. Если речь идет о крупном enterprise-приложении, то JMS Вам в помощь. Это сообщение отредактировал(а) jk1 - 8.11.2010, 08:57 -------------------- Opinions are like assholes — everybody has one |
||||||
|
|||||||
| _Y_ |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 5 Всего: 34 |
Собрал я вот эту небольшую коллекцию. И кажется понял, что Вам, Viroman, требуется. Нужно просто, чтобю мы быстренько подогнали язык Java под Ваши личные представления о том, каким этот язык должен быть. Но посыпаю голову пеплом - лично моей компетенции для этого недостаточно. ЗЫ: А может надо было с учебника начать? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||||
|
|||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |