内存中返回(并且没有返回)的对象会发生什么?

这个问题是关于 Java,以及如何创建、传递和“删除”对象。

据我所知,当你想创建一个对象时,你使用“new”关键字。根据我的理解,这个操作符 (new) 为对象分配内存,= 操作符将引用分配给这个对象在内存中的位置,给你给它的变量名。

例如,假设您像这样在 Java 中创建了一个数组。

int[] arrayX = new int[size];

=操作者现在存储参考存储器阵列到变量名arrayX

这一切都很好。

现在让我们考虑方法(函数)。

首先,根据我的理解,当您调用一个方法时,会在堆栈上为该方法的变量和进程分配内存,当该方法返回时,堆栈上的实例将被关闭/删除/放入垃圾中。但是,这并没有解释如何使用 return 关键字将在方法中创建的对象(例如数组)返回到调用者的作用域。

据我了解,由于该方法正在返回,因此其堆栈中的数据将被删除。因此,在此方法范围内创建的数组也将被删除。因此,返回到数组位置的引用将指向“垃圾”值。然而,情况显然并非如此。在 Java 中,如果您返回一个对象,则可以继续使用它。

这让我对如何创建、存储和返回对象感到困惑......

  • 创建的对象是否总是存储在永久内存中?或者

  • 确实的return操作者移动从方法的临时堆叠到调用者的堆栈中的数组或对象?

  • 如果第二种情况为真,那么在方法返回给调用者(但不返回对象)后,方法中创建的对象是否被删除?在这第三种情况下,这意味着人们不应该担心在方法中创建对象,因为这些对象将被删除。因此,如果一个程序要调用一个方法 1000 次,我们就不必担心内存会被我们只使用一次的对象填满。

我已经浏览了 edX 上提供的 Java 课程,甚至阅读了一本书(虽然没有完成),但仍然没有找到答案,所以我很感激你的意见(如果你知道的话)。

编辑:请注意,这个问题询问 3 个单独的问题:1. 对象和原语存储在哪里 2. new 运算符具体做什么 3. 返回运算符做什么


慕的地8271018
浏览 159回答 2
2回答

莫回无

但是,这并没有解释如何使用 return 关键字将在方法中创建的对象(例如数组)返回到调用者的作用域你可以这样做的原因是对象不是在堆栈上创建的;只有对它的引用。该数组一直保留在动态分配的内存中,直到它符合垃圾回收条件。当您将方法返回的结果分配给另一个变量或字段时,引用的值会被保留,因此对象会保留在内存中。返回运算符是否将数组或对象从方法的临时堆栈移动到调用者的堆栈?只有引用的值被复制。引用是一个相对较小的对象,其大小仅取决于运行 JVM 的系统。特别是引用的大小不会随着被引用对象的大小而改变,因此需要复制的数量是有限的。

青春有我

需要注意的重要一点是,如果您在方法中返回一个对象并且不保存它,它实际上会被垃圾收集。例如,如果您有:public int somemethod(){    int myint = 9;    return myint;}然后调用someMethod()您的 main 方法,为了将来访问此返回,您必须存储它。public static void main(String [] args){    this.someMethod(); //can't access myInt.    int savedInt = someMethod(); // Saves the value 9 for future access.}所以一般来说,当你调用一个方法然后返回类型在该方法从堆栈中移除之前存在时,但是为了将来使用它,你必须将值存储在一个仍然存在的变量中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java