我很想知道在将变量或对象传递给函数时,发动机罩下发生了什么。
将对象或变量传递给函数时,是在新作用域中创建的对象/变量的新副本吗? (一组括号构成java中的范围吧?)。或者是对传入的内存中现有变量/对象的引用?虽然这只对全局对象/变量有意义吗?
答案 0 :(得分:3)
java始终按值传递,因此将在函数中创建一个新变量或引用变量(引用某个对象)以接收传递给它的值... 这些变量的范围将与它创建的函数一致。
有一点你应该知道,甚至对象都是通过java中的值传递的...当人们说我们将对象传递给方法时,那个时候我们实际传递引用变量引用的值而不是对象...所以两者都是旧的和新的引用变量引用堆内存中的同一个对象。
检查这个以供参考......
http://javadude.com/articles/passbyvalue.htm
http://www.programmerinterview.com/index.php/java-questions/does-java-pass-by-reference-or-by-value/
答案 1 :(得分:3)
想到这一点最简单的方法就是不要把变量想象成永远的对象。引用变量或表达式为null或指向其类型的适当类的对象的指针。
在此模型下,所有 Java参数传递都是按值。
传递对方法的引用时,将null或指针值传递给它。对参数的赋值仅影响参数。它不会影响调用者环境中的任何变量。另一方面,如果它不为null,则它指向与调用者的变量或表达式指向的对象相同的对象。在该对象中调用值更改方法会使用指向该对象的指针(包括调用者)更改其所有代码的值。
答案 2 :(得分:2)
两者 - 你得到一个对象引用的副本(对象),以及一个原始值的副本。
因此,与C不同,您无法传入变量引用(例如,对于字符串),最终会将其重新命名为其他内容。例如,您无法传入int,并在方法中更改它的值 - 对它的任何更改都只会在方法范围内。
e.g:
MyObjectHolder holder = new MyObjectHolder();
holder.setObject(new Object());
//holder reference id = 1
// holder.object reference id = 2
doIt(holder);
public void doIt(MyObjectHolder methodScopeHolder) {
// methodScpeHolder reference id = 3
// methodScopeHolder.object reference id = 2
}
答案 3 :(得分:1)
在Java中,程序的“本地”变量保存在“堆栈框架”中,这是一个大型数组的一部分,其元素可以包含任何数据类型。
当您调用时,将参数(可能是“标量” - 字符,整数,浮点数等 - 或“引用”)复制到数组的新区域(“顶部”)。然后,在调用期间,控制可以访问的数组元素的索引值,并且复制的参数成为新堆栈帧的“底部”,被调用方法的局部变量高于参数。所以对于新方法,它的参数副本就像局部变量一样。
实际上,每个方法都有一个“窗口”进入整个堆栈,“窗口”重叠以覆盖参数列表。
当然,当你“传递”一个对象时,你实际上只是传递一个对象的引用,并且不会复制对象本身。
答案 4 :(得分:-1)
传递变量时,传递引用。 传递对象时,您传递的是它的副本。