从超类实例创建实例

did*_*_X8 18 java

考虑以下情况:

class A {
  int x;
  int y;
}

class B extends A {
  int z;
}
Run Code Online (Sandbox Code Playgroud)

现在,代码中的某个地方使用这样的类:

A objA = getAFromSomewhere();
B objB = null;
Run Code Online (Sandbox Code Playgroud)

在某种情况下,我想做类似的事情

objB = objA; // can't do this
objB.z = someZ;
Run Code Online (Sandbox Code Playgroud)

当然,真实的对象有点复杂,所以它不仅仅是复制两个整数.但它们也不过分复杂.

我知道我可以像这样写一个B的构造函数:

public B(A anA) {
  this.a = anA.a;
  this.b = anA.b;

  this.z = 0;
}
Run Code Online (Sandbox Code Playgroud)

但如果这是唯一的方法,我更喜欢将B的其他成员合并到A.

更新考虑答案

我的问题不够明确.我明白objB = objA; 不能工作(因此我要求"类似的东西",意思是代码复杂程度相似的东西),我知道浅拷贝和深拷贝的问题.
我正在寻找的是复制基类成员的可能性(假设使用clone()).您可能会理解,手动复制每个成员是一个糟糕的解决方案,因为它会增加代码的复杂性和冗余.无论如何,谢谢你的回复!

Jon*_*eet 16

对此没有简单的解决方案,因为没有一个适合所有人的解决方案.基本上你没有a内的所有信息B,所以你不能保证你会有一个"明智的" B对象.

可能只想创建一个构造函数,在B该构造函数中将A所有A数据复制到新的中B.

  • @didi_X8:确实 - 但重要的是你要理解*为什么*没有通用的优雅解决方案。例如,如果我能够编写: `Object x = "Hello"; ,这意味着什么?FileOutputStream 流 = x;`? (2认同)

JTP*_*JTP 5

如果你不害怕 commons-beanutils 你可以使用 PropertyUtils

import org.apache.commons.beanutils.PropertyUtils;
class B extends A {
B(final A a) {
try {
        PropertyUtils.copyProperties(this, a);
    }
    catch (Exception e) {
    }
}
}
Run Code Online (Sandbox Code Playgroud)