![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Snipe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 20.8.2005 Где: Архангельск Репутация: нет Всего: нет |
Только начал изучать Java(до этого работал в Delphi) и столкнулся с проблемой:
значение переменной не получается передать по ссылке, а только по значению. Как это можно реализовать?Хочется сотворить что-то вроде: procedure example(a,b:integer;var x:integer); begin x:=a+b; end; |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Переменные простых типов всегда передаются по значению. По ссылке в Java передаются объекты классов.
Для твоего примера следует поступить так:
Добавлено @ 14:07 Добавлю, что в Java методы не могут существовать вне классов. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Для передачи параметров простых типов по ссылке надо использовать объекты: или стандартные Integer, Double и т.д. (правда они не изменяемые и смысла особого в них нет), или массивы например int[] с длинной 1 (требуется проверка на то что массив будет длинны 1), или самому написать класс наподобие стандартных оберток, но позволяющий изменять передаваемое значение.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
LSD
Это, конечно, технически верно, но в данном случае, мне кажется, куда грамотнее будет сделать по простому варианту. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Snipe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 20.8.2005 Где: Архангельск Репутация: нет Всего: нет |
А если требуется изменять значение двух или более переменных например классическая задача на решение квадратного уравнения через дискрименант
procedure kv_ur(a,b,c:integer;var x1,x2:integer); ведь с помощью функции этого сделать не получится |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Тогда или массивы или свои классы-оболочки. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Делать нефиг, займусь чтением лекций
Будем мыслить в терминах объектно ориентрованного программирования. Сделаем класс квадратного уравнения (QuadraticEquation), у которого есть коэффициенты (a,b,c), корни (x1, x2) и метод solve(), т.е. "решить". Поля обычно принято делать закрытыми (private), и обращаться к ним с помощью методов set/get.
Поначалу кажется громоздким и непривычным, потом - правильным и элегантным. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Lamer George большое тебе спасибо. Решение выглядит понятным, но немножко непривычным. Надеюся позднее освоюсь с этим принципом. А с чем связаны такие ограничения на передачу параметров? Если можно передавать значение, то почему бы ны передать его по ссылке?
|
|||
|
||||
| batigoal |
|
||||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Думаю, без серьезных проблем. Ведь массовый переход к ООП был вызван именно упрощением восприятия с точки зрения программистов.
В принципе, особых ограничений нет. Если ты воспользуешься не простым типом (int), а напишешь собственный класс (MyInt), то сможешь изменять объект, переданный по ссылке как аргумент. Но это считается плохим стилем. Например, если другой программист воспользуется твоим кодом, он может и не знать что твой метод что-то меняет в его объекте, и это вызовет ошибки.
Это связано с механизмом выделения памяти, но объяснять не буду, потому что сам толком не понимаю. Это сообщение отредактировал(а) Lamer George - 24.8.2005, 15:38 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||||
|
|||||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Иногда такой подход оправдан, те же методы InputStream.read(byte[]), параметр передается по ссылке, изменяется и плюс возвращается еще один дополнительный параметр. Например в примере с уравнениями можно было сделать такую функцию
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Не только опавдан, но и практически незаменим Но в данном примере (об уравнениях) я бы все-таки предпочел свой вариант как более "строгий" с точки зрения ООП. Это сообщение отредактировал(а) Lamer George - 24.8.2005, 22:31 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
![]()
|
| Правила форума "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. |