谁用过 说一说 最好有例子
------解决方案--------------------
class Student implements Cloneable{
String name;
Student(String name){
this.name=name;
}
public Object clone(){
Object o;
try{
o=super.clone(); //调用基类Object的clone()发法,根据多态性原理,Object类可以判断出返回的是什么类型的对象;
}
catch(CloneNotSupportException e){
e.printStackTrace();
}
return o;
}
}
public CloneTest{
public static void main(String [] args){
Student s1 = new Student( "zhangshan ");
Student s2 = (Student)s1.clone(); //获得s1所指向的对象的一个拷贝
s2.name= "lisi "; //修改s2.name 不会影响s1,因为在内存中s2指向的是s1的一个拷贝(与s1指向的不是同一个内存空间),对其修改不会影响s1;
System.out.println(s1.name); //输出s1.name 仍然是zhangshan
Student s3=s1; //引用s1的值赋给s3,s1和s3指向的是同一个对象(堆中的同一个地址,即对象new Student( "zhangshan ")的首地址)
s3.name= "lisi "; //修改s3.name与修改s1.name的效果是一样的
System.out.println(s1.name); //输出s1.name变为lisi;
}
}
另外注:java中参数传递,如果传递的是基本数据类型,那么是按值传递(这点比较好理解),如果传递是引用类型,实际上也可以理解为是“传值”,这里这个值,是引用的值的拷贝,即对象的首地址,这样就会导致在函数内部可以修改外部对象,有时候我们并不希望这样的结果,正如上面的例子,我们仅仅是希望获得外部对象的一个拷贝并在函数内部修改,而不希望修改影响原始的对象,这时候就需要用到对象的拷贝。要实现对象的克隆就要使对象实现Cloneable接口,该接口是一个标识性质的接口,没有定义任何方法。但我们必须显性调用基类Object的clone()方法,已返回一个拷贝对象;