gpt4 book ai didi

java - 根据构造函数内函数的调用确定对象的资格

转载 作者:行者123 更新时间:2023-11-30 04:40:49 26 4
gpt4 key购买 nike

就 Java(任何版本)内的垃圾收集而言,这两个代码块在何时变得符合条件方面是否等效:

public class Foo  
{

public Foo()
{
go();
}

public List go()
{
List things = new List();
things.add(42);
things.add(new Object());
return things;
}
}

以及以下内容:

public class Foo  
{
public Foo()
{
}

public List go()
{
List things = new List();
things.add(42);
things.add(new Object());
return things;
}
}

我的问题如下:

从构造函数调用的函数是否会导致垃圾收集器忽略该函数范围内的任何对象(如果从构造函数调用这些对象)?

最佳答案

在你的第一个类中, go() 是从构造函数中调用的。在调用 go() 代码行之前,该对象不存在任何东西,除了该对象实例化到的变量所指向的内存空间之外。调用 go() 时,会在内存中创建一个新列表,添加内容并返回该列表。除非返回的列表被保存到某个变量中,否则它就是垃圾。该方法仍然作为对象的实例方法,但返回的列表对象现在消失了。您的第二个示例与第一个示例执行相同的操作,只是构造函数没有调用方法 go()。该方法仍然作为对象的实例方法存在,但列表对象从未创建。因此,一旦第一个示例退出方法 go(),第一个示例将处于与第二个示例创建时相同的静止状态。两者都准备好用自己的方法创建并返回一个列表,但都还没有分配列表或内存。这取决于垃圾收集器何时实际收集第一个示例中的列表,但它已被标记为垃圾(除非保存到示例中未看到的代码中某处的变量)。

关于java - 根据构造函数内函数的调用确定对象的资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12361629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com