• 技术文章 >java >java基础

    java浅拷贝的使用

    小妮浅浅小妮浅浅2021-01-19 16:47:20原创2403

    除了可以直接复制java中的对象,我们还可以创建新对象进行拷贝,如果只是简单的复制属性,那么这种就是浅拷贝了。需要注意的是,因为拷贝的类型不同,所以在赋值上分为值赋值和引用赋值两种。下面我们就java浅拷贝的概念、原理进行学习,然后在代码中使用浅拷贝。

    1.概念

    浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别:

    (1)如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值;

    (2)如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

    2.原理

    如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。换句话说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

    3.使用实例

    需要拷贝的类上实现Cloneable接口并重写其clone()方法

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    class Father{

        String name;

        public Father(String name) {

            this.name=name;

        }

        @Override

        public String toString() {

            return "Father{" +

                    "name='" + name + '\'' +

                    '}';

        }

    }

    class Son implements Cloneable {

        int age;

        String name;

        Father father;

        public Son(String name,int age) {

            this.age=age;

            this.name = name;

        }

        public Son(String name,int age, Father father) {

            this.age=age;

            this.name = name;

            this.father = father;

        }

        @Override

        public String toString() {

            return "Son{" +

                    "age=" + age +

                    ", name='" + name + '\'' +

                    ", father=" + father +

                    '}';

        }

        @Override

        protected Son clone() throws CloneNotSupportedException {

            return (Son) super.clone();

        }

    }

    public class test {

        public static void main(String[] args) throws CloneNotSupportedException {

            Father f=new Father("bigFather");

            Son s1 = new Son("son1",13);

            s1.father=f;

            Son s2 = s1.clone();

             

            System.out.println(s1);

            System.out.println(s2);

            System.out.println("s1==s2:"+(s1 == s2));//不相等

            System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//相等

            System.out.println();

      

            //但是他们的Father father 和String name的引用一样

            s1.age=12;

            s1.father.name="smallFather";//s1.father引用未变

            s1.name="son222";//类似 s1.name=new String("son222") 引用发生变化

            System.out.println("s1.Father==s2.Father:"+(s1.father == s2.father));//相等

            System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//不相等

            System.out.println(s1);

            System.out.println(s2);

        }

    }

    以上就是java浅拷贝的使用,对于这种简单的复制方法,大家只要考虑拷贝时的数据类型就可以了。当然除了浅拷贝外,对应就出现了深拷贝,大家可以持续关注这方面的内容。

    专题推荐:java浅拷贝
    上一篇:java引用拷贝是什么 下一篇:java类实现日期的时间差

    相关文章推荐

    • java事务的类型有哪几个• java声明式事务的三种方法• java之JDBC事务的应用• java对象和json的来回转换• java引用拷贝是什么

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网