Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java参考存储问题_Java_Reference - Fatal编程技术网

Java参考存储问题

Java参考存储问题,java,reference,Java,Reference,在java中,当您将一个对象作为参数传递给一个方法时,它实际上是在传递一个指向该对象的引用或指针,因为java中的对象是引用 在函数内部,它有一个指向该对象的指针,该对象是内存中的一个位置。我想知道这个指针在内存中的位置?是否在函数中创建了一个新的内存位置来保存此引用?在函数中,参数引用存储在堆栈中。这东西可以住在任何地方 当一些代码调用方法时,通常会在执行线程的堆栈上留出空间,该空间用于保存传递给函数的参数。如果其中一个参数“是一个对象”,那么真正起作用的是对一个对象的引用;该引用被复制到堆栈

在java中,当您将一个对象作为参数传递给一个方法时,它实际上是在传递一个指向该对象的引用或指针,因为java中的对象是引用


在函数内部,它有一个指向该对象的指针,该对象是内存中的一个位置。我想知道这个指针在内存中的位置?是否在函数中创建了一个新的内存位置来保存此引用?

在函数中,参数引用存储在堆栈中。这东西可以住在任何地方

当一些代码调用方法时,通常会在执行线程的堆栈上留出空间,该空间用于保存传递给函数的参数。如果其中一个参数“是一个对象”,那么真正起作用的是对一个对象的引用;该引用被复制到堆栈中,以便被调用的代码可以找到它。重要的是要认识到对象本身不是复制的,只是引用


然后,被调用代码的序言部分通常会在堆栈上为方法自身的局部变量分配更多空间,但在下面,JVM有一个指向堆栈框架的指针,其中包含所有参数,因此被调用代码可以定位由参数命名的对象。使用“new”创建的项将从堆中分配,即使在方法退出后也可以保留,但只要将堆栈指针移回调用之前的位置,堆栈上分配的所有项都将被转储。

对象不是引用,但您可以在任何地方使用引用。e、 g

String a = "abc";

a
是对
字符串的引用。所以参考文献到处流传。它们是指针吗?不。引用更像是对象的句柄。JVM可以在内存中随意移动对象。指针必须更改才能反映这一点。推荐人不会。引用可以建模为指向指针的指针。

函数的每个参数都是通过值传递的
——但是,参数不是对象,而是引用

因此,同一个对象存在两个引用

String s = "my string"; // reference to this object created
doSomething(s); // in the doSomething function, a new reference to the same point of memory is passed by value

这意味着当我使用函数
void doSomething(String str)
时,我的工作方式与函数外部的工作方式相同,只是我有一个不同的引用。被引用的对象相同,但引用不同。因此,如果在我的函数中执行
str=“different string”不会改变s-s仍然指向它一直以来所指向的内存点-但是现在
str
不再指向s指向的内容,而是指向存储“不同字符串”的位置。

例如,在JFrame中,您可以这样开始:

public myFrame mF;

public void Panel1(myFrame mF) {   your code ... }

而不是存储在堆上?我想我也想知道引用在函数调用之外的什么地方。“被引用的东西可以在任何地方存在”——不是真的;因为它是一个对象,所以它存在于堆中。@aab:这取决于。如果它是实例成员,则它是实例的一部分,实例位于堆上。类成员和数组插槽也是如此。如果它是一个局部变量,它就存在于堆栈上,就像方法参数一样。@aab如果没有方法或(类)实例再引用数据,就没有引用。引用的东西(数据)可能在堆空间中,也可能不在堆空间中,等待垃圾收集。@Michael Borgwardt-对不起。使用RTSJ几年的习惯,其中对象可以位于堆、不朽内存或各种ScopedMemory区域。“对象是引用”是一个非常模糊和误导性的说法。如果对象是引用,那么区分它们是没有意义的,不是吗?