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()); } }
浅复制和深复制的区别:
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象相同的值,而所有对其他对象的引用仍然指向原来的对象。
深复制:被复制对象的所有变量都含有与原来对象相同的值,出去那些引用其他对象的变量。那些引用其他对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。
时间: 2024-11-05 11:42:24