2013-05-06 3 views
-1

У меня есть следующий код:ссылки Пасс по значению Java

public class PassReferenceByValue { 


    static void modify(String m) 
    { 
     m = "Else"; 
    } 


    public static void main(String [] arg) 
    { 
     String actual = "Something"; 

     modify(actual); 

     System.out.println(actual); 

    } 
} 

Он будет печатать Something.

Я получаю, что Java не передает объекты вообще. Вместо этого он создает копию переданной ссылки. Если я правильно понял, когда я вызываю modify(actual) Java создает другую ссылку на тот же объект. Итак, теперь у нас есть две ссылки, ссылающиеся на объект actual. Теперь, через вторую ссылку, мы модифицируем объект, и объект должен измениться. Объект actual должен измениться, потому что через скопированную ссылку мы имеем тот же доступ к объекту.

Может ли кто-нибудь объяснить мне, где я не понимаю концепцию передачи ссылок по значению?

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference – rajesh

+1

(И посмотрите на другие другие вопросы справа). –

+0

m = "Else"; не изменяйте какой-либо объект. Он создает новый строковый объект, который содержит строку «Else», а затем меняет m для ссылки на этот новый объект. – MTilsted

ответ

-1
static void modify(String m) 
    { 
     m = "Else"; 
     System.out.println(m); 
    } 

Если вы сделаете это, m будет печатать Else, это только локальная переменная m, которая получает присвоенное новое значение. значение фактического в основном методе не изменяется здесь.

+1

Сделайте комментарий перед отрицательным голосованием. –

0

Все «переменные» в Java являются ссылками на адрес в памяти, когда объект находится.

Так у вас есть:

actual -> String("Something") 

после вызова метода у вас есть

actual -> String("Something") 

и

m -> String("Something") 

Вы просто меняющегося m -> String("Else")

бот не actual -> String("Something")

Где String("...") обозначение означает объект Строка со значением "...".

+0

Кроме того, как только вы покидаете 'modify()' переменная 'm' вышла за пределы области видимости, и поэтому ни она, ни ссылка String, которую она ссылается, не могут быть использованы. –

0

Check this

проход в Java по значению и передачу по ссылке красиво объяснил

0
  1. Строки неизменны, но это другое обсуждение
  2. Вы не модифицируя «объект», на который указывает Струнный ссылки actual. В методе modify() вы просто переписываете ссылку на пункт новый String объект под названием "Else". Теперь этот не сделать любым «эффектом» объекту, на который указывает actual.Поэтому при печати actual, она по-прежнему остается тем же

Почему я пытаюсь сделать пункт 1, что ваш метод modify был, как показано ниже

public void modify(String s) { 
    s.replaceAll("Some", "Many"); 
} 

НЕПОДВИЖН actual бы напечатали "Something" из-за Stringнеизменный поведение.

0

Вы меняете m, который является локальной переменной, видимой только в пределах modify(), ссылающейся на объект. Вы создаете новый объект String со значением «Else» и наводя на него m.

Когда вы выходите из modify() и печатаете actual, это по-прежнему ссылка на объект String, содержащий текст «Что-то».

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