java浅克隆中成员变量直接赋值和通过构造方法赋值的不同的记录
public class Person implements Cloneable {
public String pname;
public int page;
public Address address;
public Person() {}
public Integer integer=20;
public String str="jjjjjj";
public Person(String pname,int page){
this.pname = pname;
this.page = page;
this.address = new Address();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void setAddress(String provices,String city ){
address.setAddress(provices, city);
}
public void display(String name){
System.out.println(name+":"+"pname=" + pname + ", page=" + page +","+ address+" "+integer+" "+str);
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
}
在这里插入代码片
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1=new Person("zhangsan",21);
p1.setAddress("湖北省","武汉市");
Person p2= (Person) p1.clone();
System.out.println("p1: "+p1);
System.out.println("p1.getPname:"+p1.getPname().hashCode());
System.out.println("p2: "+p1);
System.out.println("p2.getPname:"+p2.getPname().hashCode());
p1.str="gggg";
p1.integer=200;
p1.display("p1");
p2.display("p2");
p2.str="hhhh";
p2.integer=1000;
p2.setAddress("湖北省","荆州市");
System.out.println("将复制之后的对象地址修改");
p1.display("p1");
p1.display("p2");
System.out.println("将复制之后的对象地址修改=========");
p1.setAddress("湖北省","荆市");
p1.display("p1");
p1.display("p2");
}
}
在这里插入代码片
p1: com.qy25.sm.main.Person@74a14482
p1.getPname:-1432604556
p2: com.qy25.sm.main.Person@74a14482
p2.getPname:-1432604556
p1:pname=zhangsan, page=21,Address [provices=湖北省, city=武汉市] 200 gggg
p2:pname=zhangsan, page=21,Address [provices=湖北省, city=武汉市] 20 jjjjjj
将复制之后的对象地址修改
p1:pname=zhangsan, page=21,Address [provices=湖北省, city=荆州市] 200 gggg
p2:pname=zhangsan, page=21,Address [provices=湖北省, city=荆州市] 200 gggg
将复制之后的对象地址修改=========
p1:pname=zhangsan, page=21,Address [provices=湖北省, city=荆市] 200 gggg
p2:pname=zhangsan, page=21,Address [provices=湖北省, city=荆市] 200 gggg
Process finished with exit code 0
执行的结果是不同的,
直接赋值时,在jvm底层会自动维护一个对象池(可以理解为对象数组),若采用直接赋值的操作,那么该实例化对象(字符串)将自动保存到对象池中,如果下次继续使用直接赋值声明了Integer类对象,那么如果此时对象池之中存在指定内容,则直接进行引用,若没有,则开辟新的字符串对象,然后将其保存在新的对象池之中以供下次使用。