Java 创建新对象

Java creating new object

我有一个抽象的 class 物种,然后是扩展物种的 class 动物,然后是我的 class 动物(例如绵羊)。在 Animals 中,我有一个方法可以检查两个对象是否在地图上的相同位置,以及它们是否属于同一类型(例如绵羊和绵羊)。

如果是,它会创建另一只羊。我对此有疑问 我试过类似的东西

Specie new_specie = this;

我的 Sheep 中有一个复制构造函数 class

     public Sheep(Sheep new_sheep){

     this(new_sheep.get_x(),new_sheep.get_y(), new_sheep.get_img());
}

然后保存到包含所有对象的数组中

species[speciesAmount] = new_specie;

但它只是将同一个对象保存在一个数组的两个元素中

species[0]
species[2]

同一个对象。有什么想法吗?

但是还有一个问题,我要更多种类的动物(eq.Wolf)我做不到

new Specie(this)

因为它是抽象的 class。

如何让它调用正确的构造函数?

编辑。我解决了,我用了clone()方法。

Specie new_specie = this; 只会创建一个名为 new_specie 的新引用,并让它引用与 this 相同的对象。因此 species[speciesAmount] = new_specie; 会将相同的引用分配给数组条目(它本身就是一个引用)。

您的代码根本没有调用复制构造函数。与 Java 中的 C++ 不同,调用复制构造函数必须如下所示:

Specie new_specie = new Sheep(this);

顺便说一句,您可能想看看 Clonable 接口,它旨在提供对象复制。

更新:关于你的第二个问题,解决方案取决于你想要实现的目标。如果您只想要一个字段上有两个具体物种的副本,您可以只比较两个物种的 classes(使用 getClass() 方法)或使用检查相等性equals()(取决于您如何定义它,它通常大于 classes)。

然后您基本上只需调用 Species new_species = species_on_field.clone() 并获取之前该字段上的内容的克隆。

另一种选择可能是使用工厂模式或基于该领域当前物种 class 的原型。不过,我会把这些留给你在网上查找。

在Java中,您不能通过赋值调用复制构造函数。你必须调用它!

species[0] = new Sheep(this);

您可以通过比较它们的 class 来比较物种,例如:

if (specieA.getClass() == specieB.getClass) {

然后,您的下一步是创造一个新物种。在运行时,您可以使用反射访问此信息。它并不是真正美丽的东西,但有时它是无法避免的(例如,你不想为每个物种创建一个开关盒):

    Class<?> clazz = specieA.getClass();
    Specie newSpecie = clazz.getConstructor(clazz).newInstance(specieA);
}

这会寻找 specieA 的 class(此处名为 clazz)的构造函数,它接受 clazz 的实例作为其输入参数。这样你应该能够克隆任何东西(当然,前提是它有一个复制构造函数)。如果有none,会抛出异常(需要try-catch)。