0%

Java 对象的赋值(复制)

今天被这个问题搞得头都大了,一直用等于号赋值,今天发现一些莫名其妙的错误,看了好多文章才发现,原来对象赋值不能用等于号,等于只能用于主类型的赋值(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();
    }
}