2015-06-19 3 views
1

Я знаю, что JAVA передает аргументы по значению (копия). Почему этот код возвращает Джона?JAVA pass аргумент

public class User { 
    String name; 
    public static void main(String[] args) { 
     User u = new User(); 
     u.name = "Sebastian"; 
     System.out.println(u.name); 
     initialize(u); 
     System.out.println(u.name); 
    } 
    public static void initialize(User u){ 
     u.name = "John"; 
     System.out.println(u.name); 
     User u2 = new User(); 
     u2.name="dsafsa"; 
     u = u2; 
     System.out.println(u.name); 
     u.name = "Lilly"; 
     System.out.println(u.name); 
    } 
} 
+2

Можете ли вы добавить свой вывод? –

+0

да, пожалуйста, предоставьте дополнительную информацию о выходе и вашей проблеме ... – n00dl3

+0

Большой вопрос: * где * он возвращает Джона и то, что вы ожидали вместо этого. – Dragondraikk

ответ

3

Ссылка на объект u передается методу initialize передается по значению (значение ссылки). Это не влияет на способ доступа к u.name.

Когда вы выполняете u.name = "John", вы меняете переданный u метод (через ссылку). Это влияет на тот же u в методе main.

enter image description here

В этом образе Person person подобен вам в вашем методе mainUser u. Внутри initialize вы User u это как Person anotherReferencetoTheSamePersonObject. Поэтому обновление одного обновления другого.

+0

В этой строке: пользователь u2 = new User(); \t \t u2.name = "dsafsa"; \t \t u = u2; , Пользователь u в главном будет «dsafsa»? – Ann

+0

'u' теперь указывает на совершенно другого пользователя. Подумайте, что «Person anotherReferencetoTheSamePersonObject» указывает на другой путь «Человек» на странице. Оригинальный «Человек-человек» все еще указывает на одно и то же. –

+0

Благодарим за помощь. – Ann

-1

Вы ошибаетесь. Java передает аргументы по значению, если это примитив. Аргументы, которые являются объектами, передаются по ссылке. Это означает, что если вы манипулируете объектом, который был передан методу в качестве аргумента, вы управляете одним и тем же объектом.

+0

Я не понимаю нисходящие точки. Хотя ваш ответ не очень ясен, это не так. Я думаю, что правильный способ увидеть это в том, что все передается по значению, но когда переданные аргументы являются объектами, вы не передаете сам объект, вы передаете * reference * этому объекту. И эта ссылка передается по значению. – rpax

-2

довольно простой и важный часть.

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

, когда вы передаете переменную, которая не является примитивной, которую посылает по ее ссылке, которая похожа на отправку, является местом в памяти.

любые изменения в нем изменится исходная переменная

0

Поскольку значение в вашем случае это ссылка, указывающая на какой-либо объект. Ссылка u в способе инициализации отличается от u в основной функции, но они все еще указывают на один и тот же объект.

с самым высоким рейтингом Ответ на этот пост объясняет это в деталях: Is Java "pass-by-reference" or "pass-by-value"?

0

Java всегда передавать аргументы по значению.

Параметры ссылочных типов данных, такие как объекты, также передаются по методу по значению. Это означает, что при возврате метода ссылка на ссылается на тот же объект, что и раньше. Однако значения полей объекта могут быть изменены в методе , если у них есть соответствующий уровень доступа. [1]

В этом создается новый объект User и передает это ссылка на значение в инициализировать метод. Таким образом, внутри метода инициализации вы ссылаетесь на тот же объект, который вы создаете в своем основном методе. Именно по этой причине исходный объект изменяется.

Так, что u.name = "John"; изменяет объект, созданный в основном методе.После u = u2; ссылка u указывает на новый объект, созданный внутри initialize метод. Следовательно, u.name = "Lilly" изменяет второй объект.

1 - https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

0

В основной вас есть u -(1)-> name, когда initialize называется у вас есть u' -(2)-> u -(1)-> name и когда вы делаете u = u2 то ссылка (2) изменились u' -(2)-> u2 -(3)-> name2. Итак, в u.name = "Lilly"; вы меняете имя u2, а u в основном все еще не изменилось.

0

Многих ответов выше suffiecient .. добавить еще один пункт

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

Что такое классы Wrapper?

Как сказано в названии, класс оболочки обертывает (охватывает) вокруг типа данных и дает ему вид объекта. Везде, где тип данных требуется как объект, этот объект можно использовать. Классы Wrapper включают методы разворачивания объекта и возврата типа данных. Его можно сравнить с шоколадом. Изготовитель обертывает шоколад с помощью фольги или бумаги, чтобы предотвратить загрязнение. Пользователь принимает шоколад, удаляет и бросает обертку и ест ее.

1

Это проблема охвата, при создании нового пользователя в методе инициализации

User u2 = new User(); 
u2.name="dsafsa"; 

и установить его в аргументе

u = u2; 

Вы только обновить ссылку аргумента в рамках метода. Но вы не изменяете пользователя, созданного в основном методе. Поскольку Java передает аргументы по значению (значение ссылки).

Если вы не измените ссылку аргумента

public static void initialize(User u) { 
    u.name = "John"; 
    System.out.println(u.name); 
    // User u2 = new User(); 
    // u2.name = "dsafsa"; 
    // u = u2; 
    System.out.println(u.name); 
    u.name = "Lilly"; 
    System.out.println(u.name); 
} 

Вы действительно обновить пользователь, созданный в главном методе. Поскольку значение ссылки всегда является одним из пользователей, созданных в основном методе.

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