[英]What does it mean for a reference to be passed by value?
鉴于这种
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使用引用的值来查找被引用的对象并调用该方法。 这称为取消引用。
您可能想要遍历JPDA javadoc,从StackFrame
开始。 浏览这些字段和类型,您将开始了解如何映射所有内容。 例如,它具有一个getValues(..)
方法,该方法返回Map<LocalVariable, Value>
。 那应该告诉你变量实际上并没有存储任何东西。 相反,它映射到一个值,该值可能是各种各样的东西 。
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,第二个println()将输出5。在c ++中,您可以通过引用传递in,这意味着a的值也将被更改。
我可以尝试,在其他一些语言中,您可以选择通过指针传递某些内容(例如,对内存区域的引用)。 Java用一个值(不是指针)调用每个函数,但是Object的值是对内存区域的引用。 另请参见您自己的类中的默认toString()
。
我总是找到一个很好的例子:
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.