我很想知道将变量或对象传递给函数时引擎盖下到底发生了什么。
将对象或变量传递给函数时,是否在新范围内创建了对象/变量的新副本?(一组括号构成java中的范围对吗?)。或者是否传入了对内存中现有变量/对象的引用?虽然这只对全局对象/变量有意义?
我很想知道将变量或对象传递给函数时引擎盖下到底发生了什么。
将对象或变量传递给函数时,是否在新范围内创建了对象/变量的新副本?(一组括号构成java中的范围对吗?)。或者是否传入了对内存中现有变量/对象的引用?虽然这只对全局对象/变量有意义?
java总是按值传递,因此将在函数中创建一个新变量或引用变量(引用某个对象)以接收已传递给它的值......这些变量的范围将与该函数一起使用它创造了。
你应该知道的一件事是,即使是对象在java中也是通过值传递的......当人们说我们将对象传递给方法时,我们实际上传递的是引用变量而不是对象引用的值......所以旧的和新的引用变量引用堆内存中的同一对象..
检查此以供参考...
http://javadude.com/articles/passbyvalue.htm
http://www.programmerinterview.com/index.php/java-questions/does-java-pass-by-reference-or-by-value/
考虑这一点的最简单方法是不要将变量视为对象。引用变量或表达式要么是 null,要么是指向其类型的适当类的对象的指针。
在此模型下,所有Java 参数传递都是按值传递的。
传递对方法的引用时,会将空值或指针值传递给它。对参数的赋值只影响参数。它不会影响调用者环境中的任何变量。另一方面,如果它不为 null,则它指向与调用者的变量或表达式指向的对象相同的对象。在该对象中调用值更改方法会使用指向该对象的指针(包括调用者)更改所有代码的值。
两者都 - 您获得对象引用的副本(对于对象)和原始值的副本。
因此,与 C 不同的是,您不能传入变量引用(例如对于字符串)并最终将其重新指向其他内容。例如,您不能传入一个 int 并在方法中更改它的值 - 对它的任何更改都只会在方法范围内。
例如:
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
}
在 Java 中,程序的“局部”变量保存在“栈帧”中,栈帧是大数组的一部分,其元素可以包含任何数据类型。
当您调用时,您将参数(可能是“标量”——字符、整数、浮点数等——或“引用”)复制到数组的新区域(“顶部”)中。然后,在调用期间,控制您可以访问的数组元素的索引值被调整,复制的参数成为新堆栈帧的“底部”,被调用方法的局部变量位于参数之上。所以对于新方法,它的参数副本就像局部变量一样。
实际上,每个方法都有一个进入整个堆栈的“窗口”,并且“窗口”重叠以覆盖参数列表。
当然,当您“传递”一个对象时,您实际上只是传递了对该对象的引用,而对象本身并没有被复制。
当你传递一个变量时,你传递的是引用。当你传递一个对象时,你传递的是它的一个副本。