您的位置:首页 > 编程语言 > Java开发

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

2017-05-18 14:41 731 查看

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());
}
}


浅复制和深复制的差别:

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

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

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





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: