java clone方法
2016-10-23 21:50
183 查看
第一:Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于Java中的非native方法。这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息复制到新对象中,虽然这也实现了clone功能。
第二:Object类中的 clone()方法被protected修饰符修饰。这也意味着如果要应用 clone()方 法,必须继承Object类,在 Java中所有的类是缺省继承 Object类的,也就不用关心这点了。然后重载 clone()方法。还有一点要考虑的是为了让其它类能调用这个 clone类的 clone()方法,重载之后要把 clone()方法的属性设置为 public。
第三:Object.clone()方法返回一个Object对象。我们必须进行强制类型转换才能得到我们需要的类型。
关于 深层拷贝与浅层拷贝
浅拷贝 是指拷贝一个对象时,该对象的成员属性如果是一个对象(String /Integer/Class对象) 则拷贝的是 原对象的引用。而这些对象的值在堆中是共同的.
深拷贝 是指拷贝一个对象时,该对象的成员属性如果是一个对象 则同时拷贝堆中的对象
class Body{
private Head head;
public Body(Head head){
this.head=head;
}
}
如果 有一个body 对象想调用 clone方法 ,则Body类需要改造
public class Body implements Cloneable {
private Head head;
@Override
public Body clone() {
Body newBody = null;
try {
newBody = (Body) super.clone();
newBody.head = (Head) head.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return newBody;
}
public Head getHead() {
return head;
}
public void setHead(Head head) {
this.head = head;
}
}
class Head implements Cloneable {
private int a;
@Override
public Head clone() {
try {
return (Head) super.clone();
} catch (Exception e) {
return null;
}
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
当 main 方法中调用 body.clone 时 就是深拷贝
1 实现 cloneable 接口 该接口是个空接口 只是是个标示接口
为什么要实现cloneable 接口 jdk上有说明
调用 super.clone时 native方法是jvm 中实现的,这里斗胆猜测下 肯定会在jvm 代码中有判断当前对象是否实现了 标志接口 没有实现 抛出 子类 不支持 拷贝的异常,所以说
如果子类仅仅是 覆盖实现clone方法 也是无法克隆一个对象的。这种类似 cloneable标志的空接口 还有 Serializable接口。
2 覆盖object类的 clone 方法
虽然这样能够实现克隆 但是刚开始理解上还是有点费解 怎么实现深拷贝的 还是以上面的例子为例说明
已经存在了一个 Body 类对象 body. 调用body.clone() 方法 则 先调用 newBody = (Body) super.clone(); 这里的super指的是父类object。 当前类是Body.其实这里是多态的应用。
object的clone方法 就是克隆出 object类型的对象 就是指的Body 所以有了强制转换。
第二:Object类中的 clone()方法被protected修饰符修饰。这也意味着如果要应用 clone()方 法,必须继承Object类,在 Java中所有的类是缺省继承 Object类的,也就不用关心这点了。然后重载 clone()方法。还有一点要考虑的是为了让其它类能调用这个 clone类的 clone()方法,重载之后要把 clone()方法的属性设置为 public。
第三:Object.clone()方法返回一个Object对象。我们必须进行强制类型转换才能得到我们需要的类型。
关于 深层拷贝与浅层拷贝
浅拷贝 是指拷贝一个对象时,该对象的成员属性如果是一个对象(String /Integer/Class对象) 则拷贝的是 原对象的引用。而这些对象的值在堆中是共同的.
深拷贝 是指拷贝一个对象时,该对象的成员属性如果是一个对象 则同时拷贝堆中的对象
class Body{
private Head head;
public Body(Head head){
this.head=head;
}
}
如果 有一个body 对象想调用 clone方法 ,则Body类需要改造
public class Body implements Cloneable {
private Head head;
@Override
public Body clone() {
Body newBody = null;
try {
newBody = (Body) super.clone();
newBody.head = (Head) head.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return newBody;
}
public Head getHead() {
return head;
}
public void setHead(Head head) {
this.head = head;
}
}
class Head implements Cloneable {
private int a;
@Override
public Head clone() {
try {
return (Head) super.clone();
} catch (Exception e) {
return null;
}
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
当 main 方法中调用 body.clone 时 就是深拷贝
1 实现 cloneable 接口 该接口是个空接口 只是是个标示接口
为什么要实现cloneable 接口 jdk上有说明
if the object's class does not support the {@code Cloneable} interface. Subclasses that override the {@code clone} method can also throw this exception to indicate that an instance cannot be cloned.
protected native Object clone() throws CloneNotSupportedException;
调用 super.clone时 native方法是jvm 中实现的,这里斗胆猜测下 肯定会在jvm 代码中有判断当前对象是否实现了 标志接口 没有实现 抛出 子类 不支持 拷贝的异常,所以说
如果子类仅仅是 覆盖实现clone方法 也是无法克隆一个对象的。这种类似 cloneable标志的空接口 还有 Serializable接口。
2 覆盖object类的 clone 方法
虽然这样能够实现克隆 但是刚开始理解上还是有点费解 怎么实现深拷贝的 还是以上面的例子为例说明
已经存在了一个 Body 类对象 body. 调用body.clone() 方法 则 先调用 newBody = (Body) super.clone(); 这里的super指的是父类object。 当前类是Body.其实这里是多态的应用。
object的clone方法 就是克隆出 object类型的对象 就是指的Body 所以有了强制转换。
相关文章推荐
- Java中很有用却很容易被忽略的方法-----clone
- java clone方法使用详解
- java Clone方法的使用
- Object.clone()方法引申出的浅克隆、深克隆、java原型模式的实现、不可变类的实现
- Java的clone方法
- Java克隆方法的研究(clone)
- JAVA中的protected(详解),以及和clone()方法有关的一些问题
- 浅析java中clone()方法
- java,实例初始化块,静态初始化块,clone方法
- java中的clone()方法
- java clone方法使用详解
- Java Clone方法之懒人实现
- java里的clone方法,super.clone()到底调用的是谁??
- java Clone使用方法详解
- java中飞clone方法
- java 的clone方法
- 【转】 java clone方法使用详解
- java,实例初始化块,静态初始化块,clone方法
- java clone方法使用详解
- java clone方法使用详解