原型模式方便吧之前在對(duì)象中設(shè)置好的值直接拿過來用或者修改;
強(qiáng)拷貝 在拷貝的過程中遇到對(duì)象再進(jìn)行拷貝判沟,不再引用被拷貝對(duì)象中的對(duì)象屬性。
淺拷貝 在拷貝過程中遇到對(duì)象直接再次引用咽弦;
對(duì)對(duì)象中的對(duì)象屬性進(jìn)行修改時(shí) 強(qiáng)拷貝不會(huì)修改 拷貝對(duì)象的屬性砂缩;淺拷貝則會(huì);
<pre>
ArrayList<Integer> numberList = new ArrayList<>();
numberList.add(1);
numberList.add(2);
Teacher teacher_1 = new Teacher(person_3);
teacher_1.setNumberList(numberList);
Teacher teacher_2 = (Teacher) teacher_1.clone();
numberList.add(3);
</pre>
當(dāng) Teacher.clone()中為強(qiáng)飲用時(shí) teacher_1會(huì)改變 teacher_2 不會(huì)
當(dāng) Teacher.clone()中為淺飲用時(shí) teacher_1會(huì)改變 teacher_2 也會(huì)
實(shí)體類:
<pre>
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() {
Person person = null;
try {
person = (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
public Person() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Person{");
sb.append("name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append('}');
return sb.toString();
}
}
public class Student extends Person {
private int number;
public Student(int number) {
this.number = number;
}
public Student(Person person) {
setName(person.getName());
setAge(person.getAge());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Student{");
sb.append("number=").append(number);
sb.append('}');
return sb.toString();
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
protected Object clone() {
Student student = null;
student = (Student) super.clone();
student.number = number;
return student;
}
}
public class Teacher extends Person {
private ArrayList<Integer> numberList;
public Teacher() {
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Teacher{");
sb.append("numberList=").append(numberList);
sb.append('}');
return sb.toString();
}
public Teacher(Person person) {
setName(person.getName());
setAge(person.getAge());
}
public ArrayList<Integer> getNumberList() {
return numberList;
}
public void setNumberList(ArrayList<Integer> numberList) {
this.numberList = numberList;
}
@Override
protected Object clone() {
Teacher teacher = (Teacher) super.clone();
// teacher.numberList = (ArrayList<Integer>) numberList.clone();
teacher.numberList =numberList;
return teacher;
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<Person> personArrayList = new ArrayList<>();
Person person_1 = new Person("張三", 10);
Person person_2 = new Person("李斯", 10);
Person person_3 = new Person("張老師", 10);
Student student_1 = new Student(person_1);
student_1.setNumber(1);
personArrayList.add(student_1);
Student student_2 = new Student(person_2);
student_2.setNumber(2);
personArrayList.add(student_2);
ArrayList<Integer> numberList = new ArrayList<>();
numberList.add(student_1.getNumber());
numberList.add(student_2.getNumber());
Teacher teacher_1 = new Teacher(person_3);
teacher_1.setNumberList(numberList);
personArrayList.add(teacher_1);
Teacher teacher_2 = (Teacher) teacher_1.clone();
numberList.add(3);
personArrayList.add(teacher_1);
personArrayList.add(teacher_2);
for (Person person : personArrayList) {
Log.i(TAG, "onCreate: " + person.toString());
}
}
}
teacher.numberList = (ArrayList<Integer>) numberList.clone(); //強(qiáng)拷貝
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=1}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=2}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2]}
teacher.numberList =numberList;//淺拷貝
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=1}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=2}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
</pre>