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

时间:2018-08-31 17:47:54

标签: java

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

据我所知,要创建对象时,可以使用“ new”关键字。据我了解,此运算符(新)为对象分配内存,=运算符将对该对象在内存中位置的引用分配给您为其赋予的变量名。

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

int[] arrayX = new int[size];

=运算符现在将对数组的引用存储到变量名arrayX中。

这很好。

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

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

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

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

  • 创建的对象是否总是存储在永久内存中?或
  • return运算符是否将数组或对象从方法的临时堆栈移动到调用者的堆栈?
  • 如果第二种情况为true,那么在方法返回给调用者之后(但不返回对象),是否删除了在方法内创建的对象?在第三种情况下,这将意味着不必担心在方法中创建对象,因为这些对象将被删除。因此,如果程序要调用一个方法1000次,那么我们就不必担心内存会被只使用一次的对象填满。

我浏览了edX上Java上提供的课程,甚至读了一本书(尽管还没有完成),但仍然没有找到答案,因此,如果您知道的话,我将不胜感激。

编辑:请注意,此问题询问3个独立的问题: 1.对象和基元存储在哪里 2.新运营商具体做什么 3.返回操作符做什么

2 个答案:

答案 0 :(得分:1)

  

但是,这不能解释如何使用return关键字将在方法中创建的对象(例如数组)返回给调用者的作用域

之所以可以这样做,是因为没有在堆栈上创建对象;仅引用它。数组将保留在动态分配的内存中,直到有资格进行垃圾回收为止。将方法返回的结果分配给另一个变量或字段时,引用的值将保留,因此对象保留在内存中。

  

返回运算符是否将数组或对象从方法的临时堆栈移动到调用者的堆栈?

仅复制参考值。该引用是一个相对较小的对象,其大小仅取决于运行JVM的系统。特别是,引用的大小不会随引用的对象的大小而变化,因此所需的复制量受到限制。

答案 1 :(得分:0)

需要注意的重要一点是,如果您在方法中返回对象并且不保存它,则实际上确实会收集垃圾。例如,如果您有:

public int somemethod(){
    int myint = 9;
    return myint;
}

然后在您的main方法中调用someMethod(),以便将来访问此退货,您必须将其存储。

public static void main(String [] args){
    this.someMethod(); //can't access myInt.
    int savedInt = someMethod(); // Saves the value 9 for future access.
}

因此,通常,当您调用一个方法,然后在将该方法从堆栈中删除之前,返回类型就存在了,但是为了将来使用它,您必须将值存储在一个仍然存在的变量中。