淺拷貝和深拷貝的差異:淺拷貝:建立一個引用相同資料的對象,更改副本也會影響原始物件。深拷貝:建立一個包含原始對象資料副本的對象,更改副本不會影響原始對象。
Java 中的淺拷貝與深拷貝
引言
在Java中,理解淺拷貝和深拷貝的概念對於物件操作至關重要。本教程將詳細介紹這兩者的差異並透過程式碼範例進行說明。
淺拷貝
程式碼範例:
class Person { private String name; private Address address; } public class ShallowCopyDemo { public static void main(String[] args) { Person p1 = new Person(); p1.setName("John Doe"); Address addr = new Address(); addr.setStreet("123 Main St."); p1.setAddress(addr); // Shallow copy Person p2 = p1; // 更改 p2 的地址 p2.getAddress().setStreet("456 Elm St."); // p1 的地址也发生了变化 System.out.println(p1.getAddress().getStreet()); // 输出:456 Elm St. } }
在這個範例中,p2
是p1
的淺拷貝,它們引用相同的Address
物件。因此,對 p2
的位址進行更改也會影響 p1
。
深拷貝
程式碼範例:
使用 clone()
方法或第三方函式庫(如 Apache Commons Lang)來實現深拷貝。
使用clone() 方法:
class Person implements Cloneable { private String name; private Address address; @Override public Person clone() { try { // 使用 super.clone() 创建新对象 return (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } public class DeepCopyDemo { public static void main(String[] args) { Person p1 = new Person(); p1.setName("John Doe"); Address addr = new Address(); addr.setStreet("123 Main St."); p1.setAddress(addr); // Deep copy Person p2 = p1.clone(); // 更改 p2 的地址 p2.getAddress().setStreet("456 Elm St."); // p1 的地址保持不变 System.out.println(p1.getAddress().getStreet()); // 输出:123 Main St. } }
在此範例中,clone()
方法為p1
建立了一個深拷貝。更改 p2
的位址不會影響 p1
,因為它們引用不同的 Address
物件。
何時使用深拷貝或淺拷貝?
例如,在快取物件或將它們傳遞給不受信任的程式碼時,務必使用深拷貝。
以上是Java中的淺拷貝和深拷貝有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!