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)。
我有一个抽象的 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)。