Java,将变量/对象传递到函数中

Java,将变量/对象传递到函数中,java,Java,我很想知道在将变量或对象传递到函数中时,引擎盖下到底发生了什么 将对象或变量传递到函数中时,是否在新范围中创建对象/变量的新副本?一组括号构成java right?中的作用域?。或者对内存中现有变量/对象的引用是否传入?尽管这只适用于全局对象/变量?两者-您可以获得对象引用的副本和基本体值的副本 因此,与C不同的是,例如,您不能为字符串传入变量引用,并最终将其重新指向其他对象。例如,您不能传入int并在方法中更改它的值-对它的任何更改都将仅在方法范围内 e、 g: 传递变量时,就是传递引用。 当

我很想知道在将变量或对象传递到函数中时,引擎盖下到底发生了什么


将对象或变量传递到函数中时,是否在新范围中创建对象/变量的新副本?一组括号构成java right?中的作用域?。或者对内存中现有变量/对象的引用是否传入?尽管这只适用于全局对象/变量?

两者-您可以获得对象引用的副本和基本体值的副本

因此,与C不同的是,例如,您不能为字符串传入变量引用,并最终将其重新指向其他对象。例如,您不能传入int并在方法中更改它的值-对它的任何更改都将仅在方法范围内

e、 g:


传递变量时,就是传递引用。
当你传递一个对象时,你传递的是它的一个副本。

java总是按值传递,因此将在函数中创建一个引用某个对象的新变量或引用变量,以接收传递给它的值。。。 这些变量的作用域将包含在它创建的函数中

有一点您应该知道,在java中,甚至对象都是通过值传递的……当人们说我们将对象传递给方法时,实际上我们传递的是引用变量引用的值,而不是对象……因此旧引用变量和新引用变量都引用堆内存中的同一对象

检查此项以供参考


考虑这一点最简单的方法是不要将变量视为对象。引用变量或表达式要么为null,要么是指向其类型相应类的对象的指针

在此模型下,所有Java参数都是通过值传递的


当您传递对方法的引用时,您将null或指针值传递给它。对参数的赋值只影响参数。它不会影响调用方环境中的任何变量。另一方面,如果它不为null,它将指向调用方的变量或表达式所指向的同一个对象。在该对象中调用值更改方法会使用指向该对象(包括调用者)的指针更改其所有代码的值。

在Java中,程序的局部变量保存在堆栈帧中,堆栈帧是大型数组的一部分,其元素可以包含任何数据类型

调用时,可以将标量(chars、int、float等)或引用的参数复制到数组顶部的新区域。然后,在调用过程中,调整控制可以访问的数组元素的索引值,复制的参数成为新堆栈框架的底部,被调用方法的局部变量位于参数之上。因此,对于新方法来说,参数的副本就像局部变量一样

实际上,每个方法在整个堆栈中都有一个窗口,窗口重叠以覆盖参数列表


当然,当你传递一个对象时,你实际上只是传递一个对该对象的引用,对象本身没有被复制。

对象通过引用传递的方式正好相反请举个例子,因为我不同意你们中的任何人……据我所知,java总是通过值传递的,不管我们是传递objectreference变量还是variable,我想说的是,创建一个对象就像创建一个新的框,复制该类的所有函数和内容,并允许调用该对象的任何对象访问该框。@Xerphiel Yes和no。这是一个完全独立的变量,但该对象引用指向原始对象。因此,如果您传入一个映射,例如,如果您向映射添加内容,那么这些项目将在方法完成后出现在映射中。但是如果你将map设置为null,当该方法返回时,原始变量仍将指向map。@例如,如果你有一把车钥匙,并给我一个副本,我就可以进入车内,做我想做的任何事情。但是,我无法更改您的密钥副本。所以你不必担心在我完成后,你的钥匙会错误地打开另一辆车。所以当你说,将地图设置为null时,你真的是指将对对象的引用设置为null吗?您可以添加到映射实例,并且可以将对映射的引用呈现为null,但在方法之外,对映射的原始引用仍然存在?确切地说。听起来你已经“明白”了。还请记住,有些对象像字符串一样是不可变的,因此当您修改字符串时,您根本无法更改它们的内部结构,因为您将获得一个新对象。“别被这弄糊涂了。”薛斐尔我在回答中加了一个例子来演示。
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

}