java浅克隆中成员变量直接赋值和通过构造方法赋值的不同的记录

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类对象,那么如果此时对象池之中存在指定内容,则直接进行引用,若没有,则开辟新的字符串对象,然后将其保存在新的对象池之中以供下次使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值