Java中的對象拷貝,可以分為深拷貝和淺拷貝。
淺拷貝是指只拷貝對象本身,而不拷貝對象內部引用的其他對象。例如:
#定義一個Person類 public class Person { private String name; private Car car; //構造函數和setter, getter方法省略 } #定義一個Car類 public class Car { private String brand; //getter和setter方法省略 } #進行淺拷貝 Person person1 = new Person(); (person1).setName("張三"); Car car1 = new Car(); car1.setBrand("BMW"); (person1).setCar(car1); Person person2 = (Person) person1.clone(); (person2).setCar(car1); (person2).getCar().setBrand("Benz"); System.out.println((person1).getCar().getBrand());//輸出 "Benz"
可以看到,淺拷貝時,雖然person2和person1指向不同的對象,但是他們的car實例都是指向同一個對象,那么如果對其中一個對象進行修改,另一個對象的內容也會發生改變。
而深拷貝則是指將整個對象及其引用的所有對象都進行完全拷貝,例如:
#進行深拷貝 Person person1 = new Person(); (person1).setName("張三"); Car car1 = new Car(); car1.setBrand("BMW"); (person1).setCar(car1); Person person2 = (Person) person1.deepClone(); (person2).setCar(car1); (person2).getCar().setBrand("Benz"); System.out.println((person1).getCar().getBrand());//輸出 "BMW"
可以看到,深拷貝時,即使person2和person1指向的是不同的對象,它們的car實例也都被完全拷貝了一份,那么對其中一個對象進行的修改,不會影響另一個對象。
需要注意的是,進行深拷貝必須讓被拷貝的對象實現Cloneable接口并重寫clone()方法,在clone()方法內部,對所有涉及到的引用對象也進行一次深拷貝。例如:
class Person implements Cloneable { private String name; private Car car; //省略構造函數和setter, getter方法 @Override public Object clone() throws CloneNotSupportedException { Person person = (Person) super.clone(); person.setCar((Car) car.clone()); return person; } } class Car implements Cloneable{ private String brand; //省略構造函數和setter, getter方法 @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
不同的應用場景需要使用不同的拷貝方法,例如使用淺拷貝可以提高性能,因為只拷貝部分內容,使用深拷貝能夠保證數據完整性,但是性能比較低。在選擇拷貝方法時,需要根據具體場景和需求進行選擇。
上一篇java汽車屬性和方法
下一篇JAVA測試工程師和開發