浅拷贝
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/// :~