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; 一定会抛出异常。

图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:如果有人看的话。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 11,103评论 0 11
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,402评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,826评论 18 399
  • 自从2009年父亲动手术以后,我们家与艾炙结下了不解之缘。 父亲做事刻板,一旦觉得对身体有益,就身体力行常炙不懈,...
    闲云姐姐阅读 1,030评论 0 2
  • 你为什么要发说说呢,你一出现在我视线,我便惶惑不安了,我就知道我还没有放下你。然后我就渴望你也没有放下我,真是一种...
    木刻茉莉阅读 290评论 0 0