-2 голоса
 
1144 просмотра
27.03.2017 / 07:31  Death

Изменение переменных

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

Например:
  1. int i = 5, d = 10;
  2. methor(i, d);
  3. System.out.println(i + ":" + d);
  4.  
  5. public void methor(int i, int d){
  6.   i += d;
  7.   d += i;
  8. }

Должен быть результат "15:15", но получается "5:10". Побывал и Integer использовать, но всё равно "5:10".
27.03.2017 / 08:23  aNNiMON
Ну-ка быстро читать про то, как передаются примитивы и объекты: по значению или по ссылке. Сюда же мутабельность/иммутабельность.
27.03.2017 / 12:37  Death
Где про это можно почитать?
27.03.2017 / 18:31  aNNiMON
В любой книге про основы Java. Шилдт, например.
Ответы
 
2 голоса
 
# 27.03.2017 / 08:41  Naik
Передавай int[2] params
27.03.2017 / 12:36  Death
Мне кажется, так же будет
 
1 голос
 
# 27.03.2017 / 08:27  Ginosaji
Так и будет. При передаче примитивов в метод они копируются, и в теле ты плюсуешь значение уже к копиям, оригинальные переменные не изменятся. С Integer фокус тоже не прокатит, потому что Integer - immutable.
27.03.2017 / 12:36  Death
И как быть?
27.03.2017 / 17:43  Ginosaji
Уже ответили: используй массив.
  1. public static void method(int []arr) {
  2.         arr[0] += arr[1];
  3.         arr[1] += arr[0];
  4.     }
  5.  
  6.     /**
  7.      * @param args the command line arguments
  8.      */
  9.     public static void main(String[] args) {
  10.         // TODO code application logic here
  11.         int[] arr = {5, 10};
  12.         method(arr);
  13.     }
Только результат будет не "15 : 15", как ты ожидаешь, а "15 : 25"
27.03.2017 / 18:49  Death
Ну вот :кек:
 
0 голосов
 
# 28.03.2017 / 08:29  Aladdin
сделай класс обертку например:
  1. public class PrimInteger {
  2.  
  3.     private int value;
  4.  
  5.     public PrimInteger(int v) {
  6.         this.setValue(v);
  7.     }
  8.  
  9.     public void setValue(int v) {
  10.         this.value = v;
  11.     }
  12.  
  13.     public int getValue() {
  14.         return this.value;
  15.     }
  16.  
  17.     public void assign(int v){
  18.         this.value += v;
  19.     }
  20. }

  1. PrimInteger i = new PrimInteger(5);
  2. PrimInteger d = new PrimInteger(10);
  3. methor(i, d);
  4. System.out.println(i.getValue() + ":" + d.getValue());
  5.  
  6. public void methor(PrimInteger i, PrimInteger d){
  7.     i.assign(d.getValue());
  8.     d.assign(i.getValue());
  9. }
28.03.2017 / 08:57  Death
Вот же у самого такая идея с начала была, но это лишний код. Хотя это выход из ситуации и применять его можно в самых необходимых случаях.
 
0 голосов
 
# 27.03.2017 / 17:35  Dimon638
Используй массив, ведь он передаётся по ссылке, в отличие от примитивов.
Изм. Dimon638 от 27.03.2017 / 17:38
27.03.2017 / 18:49  Death
Хм... Не очень удобно.
27.03.2017 / 20:55  Naik
то ты еще не видел трюка с массивом для использования не констант в колбеках(:

  1. final int[] var = {0};
  2. /...
  3. // in anonymous class
  4. var[0] = 3;
Всего: 4

Реклама

Мы в соцсетях

tw tg yt gt