打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java学习——33、浅拷贝和深拷贝

Java不提供默认拷贝构造方法,如果要将一个对象的值赋给另一个对象需要自己写拷贝构造方法。

1、拷贝构造方法

注:使用=并不是调用构造方法,而只是将地址赋给对象而已。

如:Person s=new Person();

         Persons1=s;//意思是s1s同时指向由上句new创建的实例。

此时,如果修改s的值,s1的值也会随之改变,如图所示:

但我们在修改s的值的时候,并不希望s1的值进行修改,故在创建对象时,如果是要复制已有对象的值,就需要用拷贝构造函数。

如上例,加上拷贝构造函数后:

public Person(Person p){//拷贝构造函数

        this.name=p.name;

}

main方法中,将Person s1=s改为person s1=new Person(s),再修改s的值,就不会影响s1的值了。

2、浅拷贝

当类中有引用成员类型,如对象成员时,比如Person类中有一MyDate类对象成员private Mydate birthday,此时在写拷贝构造方法时,若写成:

public Person(Person p,MyDate birthday){//拷贝构造函数

        this.birthday=p.birthday;

        this.name=p.name;

}

是不能实现对象值的拷贝的,而只是将p.birthday的地址赋给this.birthday

故需要用深拷贝。

3、深拷贝

当一个类包含引用数据类型的成员变量时,该类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用数据类型的成员变量创建新的实例,并初始化为形式参数实例值,即为深拷贝。

例:深拷贝见注释

package learn;

class MyDate{

    private intyear,month,day;

    public MyDate(){

        year=2000;

        month=1;

        day=1;

    }

    public MyDate(int year,int month,int day){

        this.year=year;

        this.month=month;

        this.day=day;

    }

    public MyDate(MyDate m){

        this.year=m.year;

        this.month=m.month;

        this.day=m.day;

    }

    public void set(int year,int month,int day){

        this.year=year;

        this.month=month;

        this.day=day;

    }

    public void show(){

        System.out.println("\n生日:"+year+""+month+""+day+"");

    }

    public void show1(){

        System.out.println("welcome");

    }

}

publicclassPersonTest

{

    private String name;

    public MyDate birthday;

    public PersonTest(){

        birthday=new MyDate();//此处赋值必须对引用成员变量新建实例,即为深拷贝

        name="123";

    }

    public PersonTest(PersonTestp){//拷贝构造函数

        this.birthday=new MyDate(p.birthday); //此处赋值必须对引用成员变量新建实例,即为深拷贝

        this.name=p.name;

    }

    publicvoid display(){

        System.out.println("姓名:"+name);

        birthday.show();

    }

    publicstaticvoid main(String args[])

    {

        PersonTestp=newPersonTest();

        p.display();

        PersonTestp1=newPersonTest(p);

        p1.display();

    }

}

其运行结果如下:


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java中this的用法
java中的引用类型概念
构造函数 析构函数 拷贝构造函数 this指针的使用
Java中构造方法的作用
C 中的explicit关键字
C++ 学习要点
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服