java 对象值复制_java中如何把一个对象的成员变量值复制到另一个对象中

今天工作时遇到这样一个问题。类B继承类A。从一个方法中得到的返回值的类型是A,然而我要显示在界面中需要的是类B。

代码段1如下:

public class A{

private String s;

}

public class B extends A{

private int i;

}

private A someMethod(){

A a = new A();

a.setS("Hello World");

return a;

}

那么问题来了,如何把对象a的成员们的值复制到对象b的同名成员中呢?

当时首先想到的就是用cast。比如下面这样

代码段2:

A aa = someMethod();

B bb = new B();

bb = (B) aa;

这段代码在编译时是没有问题的。但是在运行时就会抛出异常如下:

java.lang.ClassCastException

为什么呢?

在java中使用cast是一定要小心的。使用bb = (B) aa;这种类型转换相当于告诉java,相信我没错的,哥很专业,aa一定是类B,不会有问题的。

然而事实上aa并不是B。

从内存的角度上讲(如图1),我们首先定义了aa,其中有一个成员 s("Hello World")。而后我们定义类bb,其有一个成员s(null),及一个成员i(0)。

最后我们尝试给bb赋值,将其指向堆内存中的aa。然而bb中的i本来指向堆内存中的一个1,在我们将bb指向aa的堆内存地址时,i无所适从,因为aa的堆内存地址中不存在i的位置。

所以bb = (B) aa; 一定会抛出异常。

2ecc85be00ad

图1

如何解决这个问题?如何把aa里已经存在的值赋值到bb中呢?

方法1: copyProperties(Object source,Object target)

在我的项目里我们用了spring,其中有个一类,BeanUtils,其有一个方法copyProperties(),它可以把所有匹配的成员复制。

代码如下:

A aa = someMethod();

B bb = new B();

BeanUtils.copyProperties(aa, bb);

这个方法并不需要一定是子类与父类的赋值,只要有同名的成员变量即可。

方法2: 利用constructor()

首先在A类中写一个constructor

public class A {

private String s;

public A(String s) {

this.s = s;

}

}

然后在B类中使用A的构造方法。

public class B extends A{

public B(A a) {

super(a.getS());

}

private int i;

}

A aa = someMethod();

B bb = new B(aa);

bb.setI(1);//this works

方法3: 利用mapper手动赋值

这个方法比较简单就不写sample了。

Ps:技术层面的不足欢迎指出,我一定理清并且改正。

Ps:如果有人看的话。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值