浅拷贝
浅拷贝是创建一个新对象,这个新对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。
-
特点:
- 对于基本数据类型的成员变量,会进行值的复制。
- 对于引用数据类型的成员变量,只复制引用,不复制引用所指向的对象。这意味着新对象和原对象中的引用类型成员变量指向同一个对象。
例如:
public class Address { private String city; public Address(String city) { this.city = city; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
//定义一个类并实现Cloneable接口 public class Person implements Cloneable{ private String name; private int age; private Address address; public Person(String name, int age, Address address) { this.name = name; this.age = age; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // 重写clone方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
public class Test { public static void main(String[] args) { Address address=new Address("Beijing"); Person person=new Person("jinyu",18,address); try { //进行浅拷贝并且打印属性和地址 Person person1= (Person) person.clone(); System.out.println(person.getName()+","+person.getAge()+","+person.getAddress().getCity()); System.out.println(person1.getName()+","+person1.getAge()+","+person1.getAddress().getCity()); //修改person的地址 person.getAddress().setCity("shanghai"); System.out.println(person.getName()+","+person.getAge()+","+person.getAddress().getCity()); System.out.println(person1.getName()+","+person1.getAge()+","+person1.getAddress().getCity()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
如果对象中包含引用类型的成员变量,拷贝后的新对象和原对象中的这些引用类型成员变量将指向同一个对象。如果修改其中一个对象中引用类型成员变量所指向的对象内容,另一个对象也会受到影响。