You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将父类实例作为子类构造方法的参数传入?

子类构造方法中复制父类实例所有数据的最简方法

方法一:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:50:19