Java是一種非常流行的編程語言,它支持引用和賦值兩種操作。在Java中,變量可以存儲基本數據類型的值,也可以存儲對象的引用。
引用和賦值是不同的概念。引用是指一個變量或者表達式所指向的對象。賦值是將一個對象的引用賦值給另一個變量。在Java中,如果一個變量存儲的是對象的引用,那么這個變量就可以調用該對象的方法和屬性。
// 聲明一個對象 MyObject obj1 = new MyObject(); // obj2引用了obj1所指向的對象 MyObject obj2 = obj1; // 修改obj1的屬性 obj1.setProperty("abc"); // obj2也會受到影響,因為它們引用了同一個對象 System.out.println(obj2.getProperty());
上面的例子中,obj1和obj2都存儲了同一個對象的引用。當我們修改obj1所指向的對象的屬性時,obj2也會受到影響。這是因為它們都指向了同一個對象。
在Java中,如果我們將一個對象的引用賦值給另一個變量,那么這兩個變量就會引用同一個對象。但如果我們修改其中一個變量所引用的對象,那么另一個變量并不會受到影響。
// 聲明一個對象 MyObject obj1 = new MyObject(); // obj2引用了obj1所指向的對象 MyObject obj2 = obj1; // 修改obj1所指向的對象 obj1 = new MyObject(); // obj2不會受到影響,因為它沒有指向新的對象 System.out.println(obj2.getProperty());
上面的例子中,我們先將一個對象的引用賦值給obj1和obj2,它們都引用了同一個對象。然后我們創建了一個新的對象,并將obj1的引用指向了新的對象。此時,obj2還是引用原來的對象,并不會受到影響。
在Java中,如果我們想將一個對象的內容復制給另一個對象,需要使用深拷貝。深拷貝會創建一個新的對象,并將原對象的內容復制到新的對象中。這樣就能夠保證兩個對象的內容是完全獨立的。
public class MyObject implements Cloneable { private String property; public MyObject(String property) { this.property = property; } public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public MyObject clone() throws CloneNotSupportedException { MyObject cloned = (MyObject)super.clone(); cloned.setProperty(this.getProperty()); return cloned; } } // 聲明一個對象 MyObject obj1 = new MyObject("abc"); // 復制obj1的內容到obj2中 MyObject obj2 = obj1.clone(); // 修改obj1的屬性 obj1.setProperty("def"); // obj2不會受到影響,因為它引用的是復制后的對象 System.out.println(obj2.getProperty());
上面的例子中,我們將一個對象的內容復制給了另一個對象,并進行了修改。此時,另一個對象并不會受到影響,因為它引用的是復制后的對象。這就是深拷貝的作用。