Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462

Передача объекта класса-оболочки как параметр

15.01.2015, 18:35. Показов 3084. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код:
Java
1
2
3
4
5
6
7
8
9
10
public class t_02 {
    static void mul(double a, double b, Double res){
        res = a * b;
    }
    public static void main(String[] args){
        Double res = 0.0;
        mul(2, 2, res);
        System.out.println(res);
    }
}
Как объяснить, почему у переменной res осталось прежнее значение, и как сделать, чтобы она его поменяла?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.01.2015, 18:35
Ответы с готовыми решениями:

Передача объекта однго класса в другой класс
Имеется класс Main в котором имеется класс PortReader с обработчиком события serialEvent по приему данных из COM порта Данные появляются...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли...

Передача алгоритма инициализации массива как параметр
Здравствуйте, есть такая задачка: создайте метод, позволяющий проинициализировать одномерный массив .Массив инициализируется значениями,...

10
 Аватар для Sanan07
284 / 264 / 173
Регистрация: 27.07.2014
Сообщений: 584
15.01.2015, 18:52
HenryDukart, Потому, что примитивные типы передаются по значению, а объектные - по ссылке. Что бы изменить значение res , нужно вместо void сделать double и в методе main присвоить значение метода переменой res
Java
1
2
3
4
5
6
7
8
9
  static double  mul(double a, double b, Double res){
       return res = a * b;
   }
 
   public static void main (String [] arg) {
            
           Double res = 0.0;
           res = mul(2, 2, res);
           System.out.println(res);
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.01.2015, 18:52
HenryDukart, у переменной осталось прежнее значение, потому что Java всегда передает параметры по значению.
Для того чтобы значение поменялось проще всего будет создать класс с полем double (или Double). И передавать в качестве параметра объект этого класса. А в методе mul менять значение поля.
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
15.01.2015, 19:14
Просто Вы передаете переменную res в функцию ссылкой, это правильно. НО, в рядке 3 происходит конверсия Double на double, то есть на примитивный тип данных и соответственно, вы уже меняете не объект с помощью ссылки.
1
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
15.01.2015, 19:15  [ТС]
Sanan07, turbanoff, но ведь Double - это класс-обертка, который передается по ссылке. Получается, что я по ссылке записываю новое значение. В чем ошибка рассуждений?

Добавлено через 52 секунды
Prorok2323, спасибо, теперь я понял.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.01.2015, 22:35
Цитата Сообщение от HenryDukart Посмотреть сообщение
Получается, что я по ссылке записываю новое значение.
Да, новое значение ссылки. То значение, куда оно ссылается - не меняется
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
15.01.2015, 22:47
Цитата Сообщение от HenryDukart Посмотреть сообщение
Double - это класс-обертка,
Верно.

Цитата Сообщение от HenryDukart Посмотреть сообщение
который передается по ссылке.
Неверно. Как уже писал turbanoff все параметры передаются по значению. Ложное предположение, что экземпляры классов передаются по ссылке, исходит из того, что для всех объектов их значением является ссылка.
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
15.01.2015, 23:59
Цитата Сообщение от aleksandy Посмотреть сообщение
Сообщение от HenryDukart
который передается по ссылке.
Неверно
Бред.
Допустим у объекта класса-обертки Double есть некая функция inc(), которая увеличивает значение на единицу.
Пусть у нас есть функция:
Java
1
public static void increment(Double d) { d.inc(); }
И в main'e тогда бы выполнилось:
Java
1
2
3
4
5
public static void main(String[] args) {
       Double d = new Double(23.0);
       method(d);
       System.out.println(d);//24.0
}
Объекты передаются ссылкой.

Добавлено через 1 минуту
Цитата Сообщение от aleksandy Посмотреть сообщение
все параметры передаются
не параметры, а аргументы!!!
0
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
16.01.2015, 01:24
Цитата Сообщение от Prorok2323 Посмотреть сообщение
Объекты передаются ссылкой.
Не путайте, речь идет о параметрах - они всегда передаются по значению, будь-то примитив или ссылка на объект, и Ваш пример, ничуть это не опровергает.
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
16.01.2015, 02:00  [ТС]
aleksandy, из этого следует, что раз значением любого объекта является ссылка, а аргументы передаются по значению, то объект передается по ссылке?

Добавлено через 4 минуты
Prorok2323, я прочитал, что это не верно, потому что происходит автоупаковка, и следующие две строки являются эквивалентными:
Java
1
2
Double res = a*b;
Double res = new Double(a*b);
0
16.01.2015, 17:59

Не по теме:

Цитата Сообщение от Prorok2323 Посмотреть сообщение
не параметры, а аргументы!!!
монопенисуально

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2015, 17:59
Помогаю со студенческими работами здесь

Передача объекта как аргумент в метод
Метод printClass() предназначен для того, чтобы выводить класс вызвавшего метод объекта и объекта, переданного как аргумент методу. В...

Передача пользовательного класса как параметр метода
Добрый день. Имеется простой класс (Class Module), инкапсулирующий набор данных. Public date_ As Date Public sizo_man_inc...

Передача свойства класса как параметр метода
Добрый день! Пытаюсь передать свойство класса как параметр метода, пока не очень получается. Хочу сделать что-то типа: ...

Как вывести параметр объекта класса который находится в массиве?
class Program { List<Person> pers = new List<Person>(); static void Main(string args) { ...

Передача через параметр объекта
В первом случае мы передаем в качестве параметра объект, следовательно значения изменяются. class Program { static void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru