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()); } }
浅复制和深复制的差别:
浅复制:被复制对象的全部变量都含有与原来对象同样的值,而全部其它对象的引用仍然指向原来的对象同样的值,而全部对其它对象的引用仍然指向原来的对象。
深复制:被复制对象的全部变量都含有与原来对象同样的值。出去那些引用其它对象的变量。
那些引用其它对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。