Java中的浅拷贝与深拷贝 + Serializable的传送链接

Java中的等号赋值

Java的内存处理分为堆和栈,将基本变量(int , long, String变量值)存储在栈中,将对象指向堆的地址放在栈中,这就是说,如果对基本类型做等号赋值,就直接在栈中开辟内存空间存储,但对对象却只是重新开辟空间存储之前对象的地址。
如下代码给出说明

class Test
{
    public static void main(String arg[])
    {
        String s = "Brother Xiang";
        String t = s;
        t = t + " is very handsome!";
        System.out.println(s);//输出为Brother Xiang
        System.out.println(t);//输出为Brother Xiang is very handsome!
    }
}

说明将s, t 对应不同的String对象,修改t时不会影响s的值,以下为对对象的赋值

class Student
{
    private String name;
    private int age;

    public Student(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String toString()
    {
        StringBuilder s = new StringBuilder();
        s.append("Name: " + name + "  " + "Age: " + age);
        return s.toString();
    }
}

class Test
{
    public static void main(String arg[])
    {
        Student student1 = new Student("Bob", 14);
        Student student2 = student1;
        student2.setName("Jhon");

        System.out.print("student1: ");
        System.out.println(student1);
        System.out.print("student2: ");
        System.out.println(student2);
    }
}

执行结果为
这里写图片描述
可以看出,修改student2同时也修改了student1,这说明只赋值了对对象的引用

Java中浅拷贝与深拷贝

Java当中浅拷贝和深拷贝都是对于对象级别的来说的,浅拷贝和深拷贝的不同由如下代码就能看出

浅拷贝与深拷贝的简单形式
//浅拷贝只在Student类上加上Cloneable接口
//深拷贝则需要在Address类与Student类加上Cloneable接口

class Address
{
    private String province;
    private String city;
    public Address(String province, String city)
    {
        this.province = province;
        this.city = city;
    }
    public void setProvince(String province)
    {
        this.province = province;
    }
    public void setCity(String city)
    {
        this.city = city;
    }
    public String toString()
    {
        StringBuilder s = new StringBuilder();
        s.append("Location at: " + province + " " + city);
        return s.toString();
    }
}

class Student  implements Cloneable
{
    private String name;
    private int age;
    private Address address;

    public Student(String name, int age, Address address)
    {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Address getAddress()
    {
        return address;
    }

    public String toString()
    {
        StringBuilder s = new StringBuilder();
        s.append("Name: " + name + "  " + "Age: " + age + "  "+ address);
        return s.toString();
    }

    public Student clone()
    {
        Student temp = null;
        try
        {
            temp = (Student)super.clone();  
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return temp;
    }
}

class Test
{
    public static void main(String arg[])
    {
        Address address = new Address("GuangDong", "GuangZhou");
        Student student1 = new Student("Bob", 14, address);
        Student student2 = student1.clone();

        student2.setName("Jhon");
        Address student2_address = student2.getAddress();
        student2_address.setProvince("GuiZhou");
        student2_address.setCity("GuiYang");

        System.out.print("student1: ");
        System.out.println(student1);
        System.out.print("student2: ");
        System.out.println(student2);
    }
}
//它们两个具体区别在于,浅拷贝通过address访问Address类中方法时,student2的address发生改变,student1也发生改变,而深拷贝却不会发生改变,本代码仅给出浅拷贝的实现方式。

输出结果如下:
这里写图片描述
对对象的名字和地址进行改变时,其值也相应发生了改变,

浅拷贝与深拷贝的Serializable形式

传送门(转载链接):快乐燕子会飞——java serializable深入了解

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值