2011-11-03 4 views
0

Можно создать дубликат:
pass by reference in javaпередавая значение для функционирования

Я новичок в Java. Я попытался найти много для моего запроса, но не смог найти. Пожалуйста, помогите мне, если вы знаете. У меня есть функция:

boolean func(int a, int b, myclass obj1, myclass2 obj2) 
{ 
    ... 
} 

void caller() { 
    int a = 0, b=0; 
    myclass obj1 = null; 
    myclass1 obj2 = null; 
    func(a,b,obj1,obj2); 
    if (a == 5 && b ==2) 
    { 
     ... 
    } 
} 

, что я должен сделать так, чтобы все переданные переменные имеют значение в функции вызывающего абонента, которое дается функцией FUNC?

+1

Тогда это случилось снова. –

+0

Java проходит по значению, поэтому все, переданное от 'caller' до' func', является копией (примитивов или ссылок). Можете ли вы объяснить, что вы действительно делаете в «func», чтобы мы могли лучше подойти к тому, что вы пытаетесь сделать? – birryree

+1

Вы уже задали этот вопрос, и он был закрыт как дубликат в прошлый раз. –

ответ

0

Я думаю, вы пытаетесь использовать pass-by-reference и используете это, чтобы изменить значения ваших переменных через func. Это невозможно сделать на Java. Это строго пропускная стоимость. Даже при передаче объекта в качестве параметра то, что вы фактически передаете, является опорным значением. Так как это сделать:

func(Object o) { 
    o = "test"; 
} 
... 
other() { 
    Object a = new Object(); 
    func(a); 
} 

... не изменил a ссылки. Он все еще указывает на экземпляр объекта, а не на String «test». Метод func имеет лишь переписаны локальную переменную o, которое было дано опорное значение a, когда она была вызвана.

Я предлагаю вам инкапсулировать переменные в каком-либо классе, которые вы передаете в свой метод, или вернуться из метода, который принимает список аргументов, или переосмыслить ваш дизайн.

0

Java не работает таким образом. Когда a и b переданы в func, копии сделаны. func может изменять значения этих копий внутренне, но когда он вернется, исходные a и b не будут изменены.

Я не знаю, что a и b представляют, но позволяют сказать, что они являются координатами. Вы можете сделать это:

class Coordinates { 
    int x; 
    int y; 
    // setters and getters omitted... 
} 

boolean func(Coordinates coords, myclass obj1, myclass2 obj2) { 
... 
} 

Или, так как они начинают как ноль, возможно, это:

Coordinates func(myclass obj1, myclass2 obj2) { 
    Coordinates coords = new Coordinates(); 
    ... 
    return coords; 
} 
Смежные вопросы