オブジェクトの割り当てとクローン作成
17995 ワード
オブジェクトの割り当てとクローン作成
オブジェクト付与Date now 2=now;
2つの変数now 2とnowには同じオブジェクトのアドレスが格納され、その変数の操作にかかわらず2つは影響を受けます.now 2とnowは同じオブジェクトであるためです.
2つの変数が互いに影響を及ぼさないようにするには、クローンでのみ実現できます.Javaでのクローンは、深いクローンと浅いクローンに分けられます
クローン操作をサポートする必要がある場合は、CloneableインタフェースObjectクラスにclone()メソッドを提供する必要があります.このメソッドは、仮想マシンによって提供されるローカルメソッドです.
protected native Object clone() throws CloneNotSupportedException; Cloneableインタフェースはシンボルインタフェースに属し、具体的な実現はなく、具体的な実現は実際にObjectクラスで提供されている.カスタムクラスでCloneableインタフェース を実装する必要があるカスタムクラスではcloneメソッドを実装する必要があります.このメソッドは親クラスのcloneメソッドを呼び出すだけでよいので、一般的に浅いクローン の処理を追加する必要はありません.
深いクローンは、一般的にオブジェクトフローで実装されます.カスタムクラス要件Serializableインタフェースの実装
オブジェクト付与Date now 2=now;
2つの変数now 2とnowには同じオブジェクトのアドレスが格納され、その変数の操作にかかわらず2つは影響を受けます.now 2とnowは同じオブジェクトであるためです.
2つの変数が互いに影響を及ぼさないようにするには、クローンでのみ実現できます.Javaでのクローンは、深いクローンと浅いクローンに分けられます
クローン操作をサポートする必要がある場合は、CloneableインタフェースObjectクラスにclone()メソッドを提供する必要があります.このメソッドは、仮想マシンによって提供されるローカルメソッドです.
protected native Object clone() throws CloneNotSupportedException; Cloneableインタフェースはシンボルインタフェースに属し、具体的な実現はなく、具体的な実現は実際にObjectクラスで提供されている.
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;
}
}