Java对象克隆(复制):深复制和浅复制

来源:互联网 发布:usleep函数源码 编辑:程序博客网 时间:2024/05/16 07:54

java中,对象的赋值(我感觉是实例化,可能说法不准确)一般有三种方式(以Student类为例):
第一:Student student = new Student;(new 一个对象实例,最常用)
第二:Student student2 = student;(即将一个已存在的对象的地址复制给一个新对象,强调一下)
第三:Student student3 = student.clone();(将一个已经存在的对象的值复制给一个新对象,包括深复制和浅复制,下面将介绍)
首先,我们来看一个例子:

Student.java:public class Student implements Cloneable {    int age;    @Override    public Object clone() {        Student cloobj = null;        try {            cloobj = (Student) super.clone();        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return cloobj;    }}TestMain.java:public class TestMain {    public static void main(String[] args) {        // TODO Auto-generated method stub        Student st = new Student();        st.age = 100;        Student st1 = st;        Student st2 = (Student) st.clone();        System.out.println(st.age);        System.out.println(st1.age);        System.out.println(st2.age);        System.out.println(i);        System.out.println(j);        System.out.println("***************************************");        st.age = 10;        System.out.println(st.age);        System.out.println(st1.age);        System.out.println(st2.age);        System.out.println("***************************************");        st1.age = 200;        System.out.println(st.age);        System.out.println(st1.age);        System.out.println(st2.age);        System.out.println("***************************************");        st2.age = 300;        System.out.println(st.age);        System.out.println(st1.age);        System.out.println(st2.age);        System.out.println("***************************************");    }}

运行以上程序,输出如下:

10010010011***************************************101010021***************************************20020010023***************************************200200300***************************************

由结果可以得出结论:
通过“=”进行对象实例化的其实是地址传递,即st和st1真正指向的是同一个地址,改变st的属性值会影响st1,改变st1的属性值也会影响st,但是,无论是修改st还是st1,都不会影响st2的值,修改st2的属性值也不会影响st和st1,这说明st2指向了另一个地址区域,有过C语言基础的人都知道,C语言中有传值和传地址的区分。
未完。。。。待续

阅读全文
0 0
原创粉丝点击