对象赋值和克隆

对象赋值和克隆

对象赋值 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;
    	}
    }
    






  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值