2012-09-24 5 views
3

Я понимаю, что если передать объект как параметр функции и внести изменения в него, изменения «останутся» с объектом. Но это не так для целого числа.Могу ли я изменить переменную integer?

public void start() { 
    int x = 100; 
    modify(x); 
    // I would like x to be 200 now. But it isn't :(
} 

public void modify(int y) { 
    y *= 2; 
} 

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

ответ

4

При работе с primitives нет понятия «reference». Но вы можете добиться того, чего хотите, выполнив что-то вроде:

x = modify(x); может быть код нужен.

В настоящее время x содержит результаты вызова метода modify(x).

+0

Не тот код, в котором я нуждаюсь, но обязательно ответ, который мне нужен :) – Voldemort

+0

Все примитивы имеют обертывания объектов. Так почему бы не использовать Integer ?? Целое число x = новое целое число (5); изменить (x); –

+0

@AlexCalugarescu: все классы-оболочки неизменяемы. Несмотря на то, что вам разрешено делать то, что вы предложили, это не более чем дополнительные накладные расходы. – kosa

3

Вы не можете этого сделать. Примитивы передаются по значению. (.. Список литературы также передаются по значению Вы не можете изменить ссылку на объект, вы можете только изменить объект, на который ссылается) Лучшее, что вы можете сделать, это:

public void start() { 
    int [] x = {100}; 
    modify(x); 
    // x[0] is now 200 :) 
} 

public void modify(int []y) { 
    y[0] *= 2; 
} 

Опорный массив x передается по значению , но вы можете изменить элементы массива. Обратите внимание, что передача Integer не поможет, потому что объекты Integer неизменяемы.

В качестве альтернативы вы можете изменить свой метод, чтобы вернуть удвоенное значение и назначить его в вызывающем коде (как Nambari suggests).

0

Единственное, что вы можете сделать, это получить возвращаемое значение метода modify() и назначить его переменной следующим образом.

public void start() { 
    int x = 100; 
    x=modify(x); 
} 

public int modify(int y) { 
    return y *= 2; 
} 
+2

Не нужно использовать составное назначение в 'modify'; просто 'return y * 2;'. Кроме того, разве это не ответ Намбари? –

2

Третья возможность, кроме passing an array или using a return value, было бы передать объект некоторого ValueHolder класса с геттер и сеттер:

public class IntValueHolder 
{ 
    private int value; 
    public int getValue() 
    { 
     return this.value; 
    } 
    public void setValue(final int value) 
    { 
     this.value = value; 
    } 
} 

Это технически очень похож на прохождение массив, но ИМХО немного чище, т. е. лучше описывает ваше намерение.

Смежные вопросы