对象赋值和克隆
对象赋值 Date now2=now;
两个变量now2和now中存放是同一个对象的地址,不管操作那个变量两个都受影响,因为now2和now是同一个对象
如果希望两个变量相互不影响,则只能通过克隆实现。Java中的克隆可以分为深克隆和浅克隆
public class Student{
private long id;
private Date birth; }
浅克隆
如果需要支持克隆操作要求必须实现Cloneable接口
- Object类中提供了clone()方法,这个方法是一个本地方法,是由虚拟机提供实现的protected native Object clone() throwsCloneNotSupportedException;
- Cloneable接口属于标志性接口,没有具体的实现,具体实现实际上是Object类中提供的
public class Test2 {
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接口
public class Test2 {
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;
}
}