Java中的淺拷貝和深拷貝是非常重要的概念。淺拷貝是指創建一個新的對象,但是這個新對象只是復制了原對象的值類型域, 而引用類型域的值仍然是原對象中該引用指向的對象的地址。也就是說,淺拷貝僅僅復制了對象的引用,并沒有復制對象本身。
//淺拷貝示例代碼 class Person implements Cloneable{ private String name; private int age; private ArrayListhobbies; public Person(String name,int age,ArrayList hobbies){ this.name = name; this.age = age; this.hobbies = hobbies; } public String getName(){ return name; } public int getAge(){ return age; } public ArrayList getHobbies(){ return hobbies; } @Override public Object clone() throws CloneNotSupportedException { //調用父類的clone方法 Person person = (Person) super.clone(); return person; } } public class ShallowCopy{ public static void main(String[] args) throws CloneNotSupportedException { ArrayList hobbies = new ArrayList (); hobbies.add("shopping"); hobbies.add("reading"); Person person1 = new Person("lily", 20, hobbies); Person person2 = (Person) person1.clone();//調用clone方法進行淺拷貝 System.out.println(person1.getName()); System.out.println(person2.getName()); //輸出:lily, lily System.out.println(person1.getHobbies()); System.out.println(person2.getHobbies()); //輸出同一個地址 [shopping, reading] } }
可以看到,通過淺拷貝得到的新對象person2和原對象person1共用了一個ArrayList類型的hobbies屬性,也就是說它們指向同一個對象,如果我們修改person2中的hobbies屬性,原對象person1中也會跟著改變。