浅拷贝

浅拷贝


 1/**
 2 * a shallow copy (浅拷贝) may change original object reference
 3 *
 4 * @author wangy
 5 * @version 1.0
 6 * @date 2020/4/23 / 16:15
 7 */
 8public class ShallowCopy implements Cloneable {
 9    private String company;
10    private Name name;
11
12    public ShallowCopy(String company, Name name) {
13        this.company = company;
14        this.name = name;
15    }
16
17    public ShallowCopy(String company, String first, String last) {
18        this.company = company;
19        this.name = new Name(first, last);
20    }
21
22    public void changeCompany(String comp) {
23        this.company = comp;
24    }
25
26    public void changeFirstName(String name) {
27        this.name.changeFirstName(name);
28    }
29
30    /**
31     * it's necessary to implement <code>clone()</code>
32     * when you want to make a copy of an object
33     *
34     * @return the copy object
35     * @throws CloneNotSupportedException
36     */
37    @Override
38    protected ShallowCopy clone()
39            throws CloneNotSupportedException {
40        return (ShallowCopy) super.clone();
41    }
42
43    @Override
44    public String toString() {
45        return "Item{" +
46                "company='" + company + '\'' +
47                ", name=" + name +
48                '}';
49    }
50
51    private static class Name {
52        private String firstName;
53        private String lastName;
54
55        public Name(String firstName, String lastName) {
56            this.firstName = firstName;
57            this.lastName = lastName;
58        }
59
60        private void changeFirstName(String firstName) {
61            this.firstName = firstName;
62        }
63
64        @Override
65        public String toString() {
66            return "Name{" +
67                    "firstName='" + firstName + '\'' +
68                    ", lastName='" + lastName + '\'' +
69                    '}';
70        }
71    }
72
73    static class Test {
74        public static void main(String[] args)
75                throws CloneNotSupportedException {
76            ShallowCopy i = new ShallowCopy(
77                    "app",
78                    "steve",
79                    "jobs");
80            ShallowCopy copy = (ShallowCopy) i.clone();
81            // String 是(final)不可变的
82            copy.changeCompany("apple");
83            // 浅拷贝时,原对象的可变引用也会随拷贝对象改变
84            copy.changeFirstName("stephen");
85
86            System.out.println(i);
87            System.out.println(copy);
88        }
89    }
90}
91
92/*
93 * Item{company='app', name=Name{firstName='stephen', lastName='jobs'}}
94 * Item{company='apple', name=Name{firstName='stephen', lastName='jobs'}}
95 */
96/// :~