class 的新实例已创建或只是 space 在分配的内存中?

New instance of class created or just space in memory allocated?

更新

public Fish mate(Fish other){
  if (this.health > 0 && other.health > 0 && this.closeEnough(other)){

    int babySize = (((this.size + other.size) /2));
    int babyHealth = (((this.health + other.health) /2));
    double babyX = (((this.x + other.x) /2.0));
    double babyY = (((this.y + other.y) /2.0));

    new Fish (babySize, babyHealth, babyX, babyY);
  }
  return null;
}

当调用 new Fish 时,是否有一个新的 Fish 实例在没有 reference 的地方浮动,或者我刚刚为一个新实例分配了内存Fish 没有实际实例化它?

我能否获得 new Fish 调用来创建具有唯一引用名称的 Fish 的实际实例,而不是通过循环进行迭代?

When new Fish is called, is there a new instance of Fish floating around somewhere without a variable name or have I just allocated memory for a new Fish without actually instantiating it?

一个新的 Fish 对象将被创建,并且将被垃圾回收,因为没有对它的引用。 垃圾收集将在 (有时)Fish 的构造函数完成后进行。
在你的情况下,这没有多大意义,但有时确实如此,如果实例化一个对象将启动一个新的 Thread 或 运行 一些你想成为的其他例程 运行 只有一次.

If I have only allocated memory or there is a Fish without a name, how can I get the new Fish call to create an actual instance of the Fish with a unique variable name?

这个不是很清楚。但是我感觉到您只想 return new Fish(...); 并将其分配给您自己调用它的变量,例如:

Fish babyFish = femaleFish.mate(maleFish);

"have I just allocated memory for a new Fish without actually instantiating it?"

没有。实例被初始化(构造函数被执行),但是如果没有为这个实例保留引用,它最终将被垃圾收集。请记住,即使您的代码不这样做,也可以保留引用,例如,如果构造函数将 this 放入某个静态变量中。

首先,让我澄清一下您的术语中的一些混淆:对象 没有名称。 变量 有一个名称,但您可以有许多不同名称的变量都引用同一个对象。有命名变量引用对象并不意味着对象有名称。

如果您 new Fish() 但不将新引用分配给任何对象,一旦构造函数 returns 新对象将 无法访问 .

无法恢复该引用,下一次垃圾回收将取消分配该对象 运行。

下图的解释对我一开始的困惑很有帮助,希望对你有所帮助,因为well.You这里可以把Employee想成鱼

在你的例子中,你在一个方法中本地创建了一个 new Fish() 对象,所以它的生命周期应该在本地分配,因为 well.The 垃圾收集器总是寻找未使用的对象并识别它适合在您的方法退出后立即收集,以及方法内定义的其他局部变量。

您 return 为 null,因此不能将此方法视为工厂方法结构,因为它 return instance.I 我不确定您的意思:

Can I get the new Fish call to create an actual instance of the Fish with a unique reference name other than iterating through a loop?

但我想你问过你是否可以使用 method.The 中的确切 new Fish() 简短的回答是:不。虽然你绝对可以创建另一个 new Fish() 但你需要一个引用变量来检索该地址或者你可以 return 方法的实例而不是 null,这将是一个静态工厂方法,被称为当你想单独命名你的构造函数时的好习惯。

以更具体的方式回答您更新后的两个问题:

1)你在写 new Fish() 时确实创建了一个新对象,但你没有创建一个引用变量来真正检索该对象 information.It 就像你盖了房子但你没有' 知道 house.Then 的地址,你永远无法到达这所房子。将会发生的事情是,由于缺少检索过程,垃圾收集器会将此对象标识为未使用,因此将对其进行收集。

2) 由于没有 reference/pointer 或任何东西来获取存储在新对象中的信息,因此您无法在方法内检索到确切的 new Fish(),但您当然可以创建另一个对象如果您真的希望检索存储在对象中的信息,请使用引用变量。

最后,虽然它主要是为 C 语言的使用而编写的,但斯坦福大学的 Nick Parlante 的以下文档在解释引用、堆栈和堆内存方面做得非常出色。Click here.