我读到in this question,Java 总是按值传递。因此,甚至引用都是按值传递的。
我不明白这意味着什么,有人可以为我澄清一下吗?
答案 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
}