通过值传递引用意味着什么?

时间:2014-03-09 03:52:53

标签: java

我读到in this question,Java 总是按值传递。因此,甚至引用都是按值传递的。

我不明白这意味着什么,有人可以为我澄清一下吗?

4 个答案:

答案 0 :(得分:4)

鉴于此

Object ref = new Object();

ref实际上是存储一个值,一些地址到一个对象。我们说1234

当您通过ref

public void method(Object passed) {...}
...
method(ref);

Java实际上复制了引用的值并将其分配给参数。因此,passed也将具有值1234

同样,如果你有

Object otherRef = ref;

将复制值1234并将其分配给otherRef

如果您随后重新分配otherRef,例如

otherRef = new Object();

会为otherRef分配新值,但ref仍然具有与之前相同的值。这就是传递价值的东西。

调用方法时

ref.toString();

Java使用引用的值来查找引用的对象并调用该方法。这称为解除引用。


您可能想要从StackFrame开始浏览JPDA javadoc。浏览字段和类型,您将开始了解所有内容的映射方式。例如,它有getValues(..)方法,返回Map<LocalVariable, Value>。这应该告诉你变量实际上并不存储任何东西。相反,它被映射到一个值,其中该值可能是all sorts of things

答案 1 :(得分:1)

int a = 5;

public void foo(int num) {
num = num + 5;
System.out.println(num);
}

foo(a);

System.out.println(a);

在上面的代码中,a按值传递给foo()。这意味着创建一个新变量,其范围为foo(),其初始值与a相同。当num的值改变时,a的值不会改变。第一个println()将打印10,第二个将打印5.在c ++中,您可以通过引用传入,这意味着a的值也将更改。

答案 2 :(得分:0)

我可以尝试,在其他一些语言中,您可以选择通过指针传递内容(例如,对内存区域的引用)。 Java使用值(而不是指针)调用每个函数,但Object的值是对内存区域的引用。另请参阅您自己的类中的默认toString()

答案 3 :(得分:0)

我总觉得这是一个很好的例子:

Dog foo = new Dog("Rocky");
modifyDog(foo);
System.out.println(foo.name); //Alice

public void modifyDog(Dog aDog)
{
   aDog.name = "Alice"; //here you change the field 'name' of the object located in memory currently referenced by foo and aDog variables. 
   aDog =  new Dog();   //since aDog is a copy of foo then this won't recreate foo object
}