在java中,当您将对象作为参数传递给方法时,它实际上是将引用或指针传递给该对象,因为Java中的对象是引用。
在函数内部,它有一个指向该对象的指针,该对象是内存中的一个位置。我想知道这个指针在内存中的位置?是否在函数内部创建了一个新的内存位置来保存此引用?
答案 0 :(得分:2)
在函数中,参数引用存储在堆栈中。引用的东西可以在任何地方生活。
当某些代码调用某个方法时,通常会发生的是在执行线程的堆栈上创建空间,并且该空间用于保存传递给该函数的参数。如果其中一个参数“是一个对象”,那么真正起作用的是对象的引用;该引用被复制到堆栈中,以便被调用的代码可以找到它。重要的是要认识到对象本身不是复制的,只是参考。
然后,被调用代码的序言部分通常会在堆栈上为该方法自己的局部变量分配 more 空间,但在下面,JVM有一个指向堆栈帧的指针,其中包含所有参数,因此被调用的代码可以找到参数指定的对象。使用'new'创建的项目将从堆中分配,并且即使在方法退出后也可以保留,但是只需将堆栈指针移回到调用之前的位置,就可以转储堆栈上分配的所有项目。
答案 1 :(得分:0)
对象不是引用,但您在任何地方都使用引用。 e.g。
String a = "abc";
a
是引用到String
。所以引用遍布各处。他们是指针吗?不。引用更像是对象的句柄。 JVM可以随意移动内存中的对象。指针必须改变以反映这一点。参考文献没有。引用可以建模为指针指针。
答案 2 :(得分:0)
函数的每个参数都是passed by value
- 但是,参数不是对象,而是参考。
所以同一个对象存在两个引用它。
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
而不是指向指向的内容,现在指向存储“不同字符串”的位置。
答案 3 :(得分:0)
例如在JFrame中你可以这样开始:
public myFrame mF;
public void Panel1(myFrame mF) { your code ... }