Java学习笔记----你可能不知道那些知识,对象复制与引用

1.private ,protected,static不能用来修饰interface。

2.java在处理基本数据类型(比如int ,char,double)时,都是採用按值传递的方式运行。除此之外的其他类型都是按引用传递的方式运行。对象除了在函数调用时时引用传递,在使用“=”赋值时也是採用引用传递。

3.怎样在java中进行对象的复制。而不是引用。举例:

class Obj implements Cloneable{
	private int a=0;
	public int getA(){
		return a;
	}
	public void setA(int b){
		this.a=b;
	}
	public void changedA(){
		this.a=1;
	}
	public Object clone(){
		Object o=null;
		try{
		0=(Obj)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStatckTrace();
		}
		return o;
	}
}
public class TestRef{
	public static void main(String args[]){
		Obj a= new Obj();
		Obj b=(Obj)a.clone();
		b.changedA();
		System.out.println("a:"+a.getA());
		System.out.println("b:"+b.getA());
	}
}

程序执行结果为:

a:0

b:1

因此要赋值一个类,必须实现Cloneable接口。步骤:

(1)实现clone的累首先要继承Cloneable接口。

Cloneable接口实质是一个标识接口(没有不论什么方法,即空接口)

(2)在类中重写Object类的clone()方法。

(3)在clone()方法中调用super.clone().

(4)把浅复制的引用指向原型对象新的克隆体。

当类中有除基本数据以外的其他复杂对象属性时,在重写clone()方法时要对非基本类型的属性完毕深复制。举比例如以下:

class Obj implements Cloneable{
private Date birthday = new Date();
	private int a=0;
	public int getA(){
		return a;
	}
	public void setA(int b){
		this.a=b;
	}
	public void changedA(){
		this.a=1;
	}
	public Date getDate(){
		return birthday();
	}
	public void setDate(Date date){
		this.birthday = date;
	}
    public void changeDate(){
		this.birthday.setMonth(4);
    }
	public Object clone(){
		Object o=null;
		try{
		0=(Obj)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStatckTrace();
		}
	//实现深复制
	o.birthday=(Date)this.getDate().clone();
		return o;
	}
}
public class TestRef{
	public static void main(String args[]){
		Obj a= new Obj();
		Obj b=(Obj)a.clone();
		b.changedA();
		System.out.println("a:"+a.getA());
		System.out.println("b:"+b.getA());
	}
}


浅复制和深复制的差别:

浅复制:被复制对象的全部变量都含有与原来对象同样的值,而全部其它对象的引用仍然指向原来的对象同样的值,而全部对其它对象的引用仍然指向原来的对象。

深复制:被复制对象的全部变量都含有与原来对象同样的值。出去那些引用其它对象的变量。

那些引用其它对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。





posted @ 2017-05-18 14:41  wzjhoutai  阅读(207)  评论(0编辑  收藏  举报