2011-12-15 3 views
0

Я знаю, что если вы передадите тип класса в качестве параметра для метода, указатель будет передан, и если вы отредактируете параметр в методе, вы также отредактируете исходный экземпляр объекта, который вы передали (для например, если метод с именем public void changeColor(Color color) делает следующий код:Java-примитивы при передаче параметров класса class

public void changeColor(Color color) 
{ 
    color = new Color(20, 100, 50); 
} 

и вы назвали значение, как так:

Color color = new Color(10, 20, 30); 
System.out.println(color.toString()); 
changeColor(color); 
System.out.println(color.toString()); 

обе строки консоли должны отличаться друг от друга (java.awt.Color[r=10,g=20,b=30] и java.awt.Color[r=20,g=100,b=50]), таким образом, значение я s изменено и указатель передан. С другой стороны, если вы используете целочисленное значение, которое является примитивным, вы получите другой результат:

public void changeNumber(int i) 
{ 
    i = 10; 
} 

и вы назвали значение, как так:

int n = 5; 
System.out.println(n); 
changeNumber(n); 
System.out.println(n); 

консоль не печатает 5 и 10, но на обеих линиях указано 5. С учетом сказанного, если бы я имел это:

public class A 
{ 
    public int i; 
    public Color c; 

    public A(int n, Color color) 
    { 
     i = n; 
     c = color; 
    } 
} 

И в работоспособный классе ...

public static void main(String[] args) 
{ 
    A a = new A(10, new Color(10, 40, 23)); 
    changeA(a); 
} 

public static changeA(A varA) 
{ 
    varA.i = 54; 
    varA.c = new Color(40, 30, 264) 
} 

Будет ли я внутри класса и действовать, как если бы он был частью указателя А или будет ли значение, если ai в основном методе не изменится после запуска changeA (a); Если нет, что я могу сделать, это изменится?

+0

Начать здесь: http://stackoverflow.com/questions/8263446/how-to-verify-call-by-value-of-java –

+0

Это неправильно. Объект 'color', переданный' changeColor() ', не изменится. Вы действительно запустили свой код? Java передает ссылки по значению. Это означает, что метод не может заставить ссылку звонящего указывать на что-то новое. – erickson

ответ

0

Будет ли я внутри класса А также действовать как если бы оно было частью указателя А или будет значение, если д.в. в основной метод не изменяется после того, как я бегу changeA (а)

The значение i в экземпляре A, переданном как параметр A, изменится.

Но я бы не сказал, что он действует «как если бы он был частью указателя A». Ссылка на A является единственным неизменным значением. Вы меняете состояние объекта, к которому он относится.

Кстати, это не то, что означает «передать по ссылке», и оно не аналогично передавать по ссылке, как реализовано на таких языках, как C# и C++, или C hack передачи адреса переменной/член/безотносительно.

+0

Nit: C++ и C# имеют call-by-reference, а C - нет. (Передача указателя - это вызов по значению.) –

1

Вы хотите перейти по ссылке на Java. Это невозможно. См. Ответы на вопрос this для получения более подробной информации.

+1

Я не согласен с 'call-by-reference'. Я считаю, что лучше говорить о них как * all * 'call-by-value' (где объекты являются' call-by-value- [of-the-reference] ') или, что я предпочитаю,' call-by -value' для примитивов и 'вызов-объект-разделение' для объектов. См. Статью [Оценка стратегии] (http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing). 'call-by-reference' подразумевает разную семантику wrt. * присвоение переменных параметров *. –

0

Это было прежде, чем объяснить, так много раз, и в два раза выше, но это, как я хотел бы объяснить:

(Пожалуйста, обратите внимание, что я глянец «внутренние детали»: Я считаю, что они не нужны чтобы рассказать о семантике, но они должны быть поняты в конце дня. Фактически, я даже не собираюсь обсуждать evaluation strategies used, за исключением того, что Java использует call-by-value, и что переданные объекты имеют call-by-object-sharing семантику, которая достигнута внутренне, передавая ссылку объекта объекта в качестве значения.)

  • Когда примитивное значение передается копия сделана. (Хотя это несколько не имеет отношения к следующей точке, так как примитивные значения не могут быть изменены.)

  • Когда объект передается (или назначен), тот же объект передается (или назначено). Копия объекта не происходит: если повторно не назначена соответствующая переменная параметра, будет оцениваться тому же объекту в качестве переданного (или null, возможно). Начиная с объект сам по себе, затем мутирует объект в одном месте - независимо от того, какое «имя переменной» он имеет в настоящее время, - изменяет тот же объект.

Я вам нужен новый, независимый объект, а затем создать один :)

Днем кодирования.

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