java 对象拷贝工具 java拷贝一个对象

您所在的位置:网站首页 java引用和赋值 java 对象拷贝工具 java拷贝一个对象

java 对象拷贝工具 java拷贝一个对象

2023-06-30 21:32| 来源: 网络整理| 查看: 265

java 对象拷贝工具 java拷贝一个对象_java 对象拷贝工具

在Java中,因为对象那个都是引用数据类型,所以通过=赋值的方式我们得到的是同一个对象(指向同一块内存)。其中一个对象改变,另一个跟着改变。有时候我们虽然对对象进行修改,却希望保留原来的对象(域,方法是一样的,不要求地址一样),这就需要我们对对象进行拷贝。

Java中对象的拷贝分为浅拷贝和深拷贝。要实现拷贝须要覆写父类Object类中的clone()方法,不过它是protected类型的,我们需要重写它并修改为public类型。同时需要实现 java.lang.Cloneable接口,来告诉JVM该类的clone方法对该类的实例进行逐域复制是合法的,否则会抛出CloneNotSupportedException异常。

拷贝和赋值的区别:

赋值的对象和原对象指向同一块内存,拷贝的对象和原对象不是一个指向,而是创建一个新的对象。

现定义Address类:

class Address implements Cloneable{ private String city; private String country; public Address(String country,String city) { this.city=city; this.country=country; } public String getCity() { return city; } public boolean setCity(String city) { this.city=city; return true; } public String getCountry() { return country; } public boolean setCountry(String country) { this.country=country; return true; } @Override public Address clone() throws CloneNotSupportedException { return (Address) super.clone(); }

测试:

public class CloneObject { public static void main(String []args) throws CloneNotSupportedException { Address ad1=new Address("中国","深圳"); Address ad2=ad1; //赋值的对象和原对象指向同一块内存 System.out.println(ad1==ad2);//true //拷贝的对象和原对象不是一个指向 Address ad3=ad1.clone(); System.out.println(ad1==ad3);//false //原对象修改,拷贝对象不修改。 ad1.setCity("杭州"); System.out.println(ad1.getCity());//HangZhou System.out.println(ad2.getCity());//HangZhou System.out.println(ad2.getCity());//ShenZhen } }

浅拷贝:

可以看到浅拷贝时,user1内部成员变量是对象时,不被拷贝, 仅仅拷贝基本类型,成员变量是对象的还是原来的那个。

现定义User:

class User implements Cloneable{ private String name; private Address address; public User(String name,Address address) { this.name=name; this.address=address; } public String getName() { return name; } public boolean setName(String name) { this.name=name; return true; } public Address getAddress() { return address; } public boolean setAddress(Address address) { this.address=address; return true; } @Override public User clone() throws CloneNotSupportedException { User user = (User) super.clone(); return user; } }

测试:

package JavaSe.Object; public class CloneObject { public static void main(String []args) throws CloneNotSupportedException { User user1=new User("张三",new Address("中国","深圳")); User user3=user1.clone(); //可以看到浅拷贝时,user1内部成员变量是对象时,不被拷贝, 仅仅拷贝基本类型,成员变量是对象的还是原来的那个 System.out.println(user1==user3);//false System.out.println(user1.getAddress()==user3.getAddress());//true //基本类型的成员 user1.setName("李四"); System.out.println(user1.getName());//"李四" System.out.println(user3.getName());//"张三" //对象成员 user1.getAddress().setCity("杭州"); System.out.println(user1.getAddress().getCity());//杭州 System.out.println(user3.getAddress().getCity());//杭州 } }

深拷贝:

与浅拷贝不同的是,深拷贝可以拷贝不仅仅要复制基本类型的成员变量也要复制对象类型成员变量。

对user的clone()方法做如下修改:

@Override public User clone() throws CloneNotSupportedException { User user = (User) super.clone(); user.setAddress(this.address.clone());如果是深拷贝时,就添加该行代码 return user; }

测试:

public class CloneObject { public static void main(String []args) throws CloneNotSupportedException { User user1=new User("张三",new Address("中国","深圳")); User user3=user1.clone(); System.out.println(user1==user3);//false System.out.println(user1.getAddress()==user3.getAddress());//false //基本类型 user1.setName("李四"); System.out.println(user1.getName());//"李四" System.out.println(user3.getName());//"张三" //对象类型 user1.getAddress().setCity("杭州"); System.out.println(user1.getAddress().getCity());//杭州 System.out.println(user3.getAddress().getCity());//深圳 } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3