java从超类实例创建实例
考虑以下情况:
class A {
int x;
int y;
}
class B extends A {
int z;
}
现在,在代码的某个地方,这些类的用法如下:
A objA = getAFromSomewhere();
B objB = null;
在某种情况下,我想做一些
objB = objA; // can't do this
objB.z = someZ;
当然,真正的对象要复杂一点,所以不仅仅是复制两个整数。但它们也不太复杂
我知道我可以像这样为B编写构造函数:
public B(A anA) {
this.a = anA.a;
this.b = anA.b;
this.z = 0;
}
但如果这真的是唯一的方法,我更喜欢将B的其他成员合并到A中
根据答案进行更新
我的问题不够清楚。我理解objB=objA;无法工作(因此我要求“类似”,意思是代码复杂度相当的东西),我知道浅拷贝与深拷贝的问题
我所寻找的是复制基类成员的可能性(比如使用clone()。您可能理解,手动复制每个成员是一个糟糕的解决方案,因为它会增加代码的复杂性和冗余。谢谢你的回复
# 1 楼答案
也许你可以这样做:
您仍然列出了每个字段,但每个类只列出一次
# 2 楼答案
没有简单的解决方案,因为没有一刀切的解决方案。基本上,您没有
B
中的所有信息,因此无法保证您会有一个“合理的”B
对象您可能只想在
B
中创建一个构造函数,它接受一个A
并将所有A
数据复制到新的B
中# 3 楼答案
。。。不是因为这是人们应该做的,而是因为我觉得这是一个挑战,下面是一些测试代码,它可以简单地复制对象(使用setter和getter方法):
# 4 楼答案
如果你不害怕普通的小动物,你可以使用PropertyUtils
# 5 楼答案
这里有一个(相对)微不足道的解决方案
在
class B
中实现一个构造函数,该构造函数接受class A
的实例并复制字段语言本身没有通用解决方案的原因之一是深度复制的问题
例如,如果源对象包含更多的
Objects
,而不是普通类型,那么泛型复制操作符会做什么?只是复制参考资料(提供一个浅显的副本),还是制作真实的副本那么,如果其中一个对象是
Collection
呢?它是否也应该复制集合中的每个元素唯一合乎逻辑的结论是执行一个浅复制,但是实际上你根本没有得到一个复制
# 6 楼答案
我也很震惊
您确实不能这样做:
objB = objA;
。 因为雷诺和宝马是汽车,但不是所有的汽车都是宝马谢谢你把A当作汽车,B当作宝马
现在你说: