如何将父类实例作为子类构造方法的参数传入?
子类构造方法中复制父类实例所有数据的最简方法
方法一:使用Bean拷贝工具类(最省心)
直接借助成熟的Bean拷贝工具,比如Apache Commons BeanUtils或Spring BeanUtils,一行代码完成所有属性的拷贝,无需手动维护字段列表。
示例代码:
import org.apache.commons.beanutils.BeanUtils; import java.util.Random; public class Creature extends Egg { private double potency; public Creature(Egg egg) throws Exception { // 自动拷贝父类实例的所有可访问属性到当前子类对象 BeanUtils.copyProperties(this, egg); // 初始化子类独有的属性 this.potency = new Random().nextDouble(); } }
不管父类Egg后续新增或修改属性,都不需要修改Creature的构造方法,工具类会自动处理。
方法二:自行实现反射拷贝(无第三方依赖)
如果不想引入外部依赖,可以用Java反射遍历父类及自身的所有字段,手动完成值的复制。
示例代码:
import java.lang.reflect.Field; import java.util.Random; public class Creature extends Egg { private double potency; public Creature(Egg egg) throws IllegalAccessException { copyFieldValues(egg, this); this.potency = new Random().nextDouble(); } private void copyFieldValues(Object source, Object target) throws IllegalAccessException { Class<?> currentClass = source.getClass(); // 遍历当前类及所有父类的字段 while (currentClass != null) { Field[] fields = currentClass.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); // 允许访问私有字段 field.set(target, field.get(source)); } currentClass = currentClass.getSuperclass(); } } }
注意:反射需要处理IllegalAccessException,且无法修改final类型的字段。
方法三:父类提供拷贝构造方法(类型安全)
让父类自己实现拷贝构造逻辑,子类通过super()调用该构造方法,完成父类属性的复制。
先修改父类Egg:
public class Egg { private String color; private int weight; // 父类拷贝构造方法 public Egg(Egg other) { this.color = other.color; this.weight = other.weight; } // 其他构造方法及逻辑 }
然后子类Creature的构造方法:
import java.util.Random; public class Creature extends Egg { private double potency; public Creature(Egg egg) { super(egg); // 调用父类拷贝构造,复制父类属性 this.potency = new Random().nextDouble(); } }
这种方式类型安全,无需处理异常,但如果父类新增属性,需要同步更新父类的拷贝构造方法。
内容的提问来源于stack exchange,提问作者Blazing Blast
相关产品推荐
相关产品推荐

