今天被这个问题搞得头都大了,一直用等于号赋值,今天发现一些莫名其妙的错误,看了好多文章才发现,原来对象赋值不能用等于号,等于只能用于主类型的赋值(String,int,float之类),而如果是其他的类生产的对象,用等于号是映射,并非赋值,只要改了等号一边的值,另一边的也跟着变化,就是说JAVA没有开辟新的内存,只是给原来的对象再起了个名字而已。 如果需要赋值,就需要类实现Cloneable接口,实现clone()方法。
class D implements Cloneable{//实现Cloneable接口
String sex;
D(String sex){
this.sex=sex;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 实现clone方法
return super.clone();
}
}
赋值的时候:
D d=new D("男");
D d2=(D) d.clone();//把d赋值给d2
如果类中的变量不是主类型,而是对象,也需要调用该对象的clone()方法 下面是一个完整的例子:
public class Test2 {
public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
D d=new D("男");
C c=new C("张三","20",d);
C new_c=(C) c.clone();//调用clone方法来赋值
new_c.name="李四";
d.sex="女";//d
System.out.println(c.d.sex);
System.out.println(c.name);
}
}
class C implements Cloneable{
String name;
String age;
D d;
C(String name,String age,D d) throws CloneNotSupportedException{
this.name=name;
this.age=age;
this.d=(D) d.clone();//调用clone方法来赋值,这样即便外部的d发生变化,c里的也不会变
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
class D implements Cloneable{//实现Cloneable接口
String sex;
D(String sex){
this.sex=sex;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 实现clone方法
return super.clone();
}
}