复制引用
只是复制对象之间的引用,本质上还是引用的同一个对象
public static void main(String[] args) {
Person p1 = new Person(10, "zhang");
Person p2 = p1; //引用的复制,并不是对象的复制
System.out.println("p1 = " + p1 + ","+" p2 = "+p2);
/*
* p1 = com.llm.test.Person@1540e19d, p2 = com.llm.test.Person@1540e19d
* */
}
复制对象
要实现clone()方法,完成对象复制(产生一个新对象)
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person(10, "zhang");
Person p2 = (Person)p1.clone(); //浅拷贝
System.out.println("p1 = " + p1 + ","+" p2 = "+p2);
/*
* p1 = com.llm.test.Person@1540e19d, p2 = com.llm.test.Person@677327b6
* */
}
浅拷贝和深拷贝
- 浅拷贝:拿Person对象里面的age和name字段来举例,由于age是int类型(基本数据类型字段),所以p1在clone对象时直接赋值给新的对象p2,但是此时字段name是String类型,使用的是引用传递
Person类
public class Person implements Cloneable{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试类
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person(10, "zhang");
Person p2 = (Person)p1.clone(); //引用的复制,并不是对象的复制
System.out.println(p1.getName() == p2.getName() ? "浅拷贝" : "深拷贝"); //浅拷贝
}
-
深拷贝:就是除了age字段之外,把name字段也给复制,完成引用对象的拷贝
要完成深拷贝,要做到下面这点:完成clone方法的重写(对应引用字段)
@Override protected Object clone() throws CloneNotSupportedException { Person p = (Person)super.clone(); p.name = name.clone(); return super.clone(); }
这里就有一个问题!!!String的对象并不能调用clone()方法
所以,怎么办呢?
总结了一下:
- String类没有实现Cloneable接口,也没有实现clone()方法
- String 是 final的,所以用到clone的机会很少
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202521.html