物件賦值和克隆
物件賦值 Date now2=now;
兩個變數now2和now中存放是同一個物件的地址,不管操作那個變數兩個都受影響,因為now2和now是同一個對 象
如果希望兩個變數相互不影響,則只能通過克隆實作,Java中的克隆可以分為深克隆和淺克隆
如果需要支持克隆操作要求必須實作Cloneable介面
Object類中提供了clone()方法,這個方法是一個本地方法,是由虛擬機提供實作的
protected native Object clone() throws CloneNotSupportedException; Cloneable介面屬于標志性介面,沒有具體的實作,具體實作實際上是Object類中提供的
-
自定義類上要求實作Cloneable介面
-
自定義類中要求實作clone方法,這個方法只需要呼叫父類的clone方法即可,一般不需要額外的處理
淺克隆
import java.util.Date;
public class Main1 {
public static void main(String[] args) throws Exception {
Student s1 = new Student();
s1.setId(100L);
s1.setBirth(new Date()); // 淺克隆,只是克隆s1物件,但是針對s1中的參考型別屬性只是克隆地址
Student s2 = (Student) s1.clone();
s2.getBirth().setYear(9000);
System.out.println(s2);
System.out.println(s1);
}
}
class Student implements Cloneable {
private Long id;
private Date birth;
public Object clone() throws CloneNotSupportedException { // 定義該方法的原因是Object中的 clone方法是protected的
return super.clone();
}
@Override
public String toString() {
return "Student [id=" + id + ", birth=" + birth + "]";
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
深克隆
一般采用物件流實作,自定義類要求實作Serializable介面
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
public class Main1 {
public static void main(String[] args) throws Exception {
Student s1 = new Student();
s1.setId(100L);
s1.setBirth(new Date());
//淺克隆,只是克隆s1物件,但是針對s1中的參考型別屬性只是克隆地址
Student s2 = (Student) s1.deepClone();
s2.getBirth().setYear(9000);
System.out.println(s2);
System.out.println(s1);
}
}
class Student implements Serializable {
private Long id;
private Date birth;
//其中的屬性也必須實作了序列化介面 private transient String password;//transient表示該屬性不能被序列化處理
public Student deepClone() {
Student res = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
res = (Student) ois.readObject();
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
@Override
public String toString() {
return "Student [id=" + id + ", birth=" + birth + "]";
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265904.html
標籤:java
