Как проверить вызов по значению Java? - PullRequest
3 голосов
/ 25 ноября 2011

Я прочитал, что Java все делает по вызову по значению . Мне было интересно, как проверить этот факт? Насколько я понимаю, в случае объектов (не примитивов) функции получают собственную копию ссылки, но указывают на один и тот же объект. В этом случае ссылка на этот объект в функции вызываемой и вызывающей функции должна отличаться? Как я могу это проверить? Другими словами, как распечатать ссылку на объект.

System.out.println(object);  //does this print reference i.e text following @

EDIT: Я понимаю, что изменение объекта в функции вызываемого абонента меняет значение в функции вызывающего абонента. Меня интересует, как напечатать ссылки на объекты, а также то, какое свойство я могу напечатать на консоли, что ясно показывает мне две разные ссылки.

Ответы [ 3 ]

9 голосов
/ 25 ноября 2011

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

Но если Java передается по ссылке:

public static void nullify(Object obj) {
    obj = null;
}

public static void main(...) {

    String x = "Hello";        
    nullify(x);

    System.out.println(x);
}

Звонок в С.о.п. вывел бы null, если бы Java передавалась по ссылке. Но это не так, поэтому x без изменений, и вы получите Hello.

1 голос
/ 25 ноября 2011

Предполагая, что свойство класса A aa

A a= new A();
a.aa = 1;
// print a.aa here should be 1
method(a);
// here a.aa should be 2


Void method(A a) {
  a.aa =2;
  a = new A();
  a.aa = 3;
}

Так что это показывает, что ссылка была передана как значение.Когда вы изменяете объект в методе, он не меняет ссылку на вызывающего.

0 голосов
/ 25 ноября 2011

Я думаю, что String Object @ 1ed3af состоит из имени класса вашего объекта и его хеш-кода, разделенного символом @.Это уникальная строка, идентифицирующая ее.
Прочитайте эту тему , чтобы получить полное объяснение!

...