Java中的Cloneable接口下的clone深拷贝,单纯的获取那个时刻的值
2017-09-19 20:54
656 查看
1.背景
用java写程序的时候很苦恼的一件事就是,如果将一个对象a赋给另一个对象b,那么你改变a的变量值得时候,b的值也对应的变化。如果我们只想单纯的获取那个时刻的a的状况给b的话,就要用到clone方法了。比如说如下代码:
[java] view
plain copy
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Node n=new Node();
Node n1=n;
n.a=5;
System.out.print(""+n1.a);
}
}
public class Node {
int a=1;
}
输出结果是5,
下面就利用clone实现如上情况输出结果是1.
2.代码
克隆的实现需要一下几步:在派生类中覆盖基类的clone()方法,并声明为public。
在派生类的clone()方法中,调用super.clone()。
在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。
首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换
[java] view
plain copy
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Node n=new Node();
Node n1=(Node)n.clone();
n.a=5;
System.out.print(""+n1.a);
}
}
public class Node implements Cloneable{
int a=1;
public Object clone(){
Node n=null;
try{
n=(Node)super.clone();
}
catch(Exception e ){
e.printStackTrace();
}
return n;
}
}
输出结果是1;
ps:补充一道题
15. 不通过构造函数也能创建对象吗()
A 是 B 否
答案:A
解析:Java创建对象的几种方式(重要):
(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。
相关文章推荐
- java 重写接口Cloneable的Clone方法 拷贝对象
- Java 深拷贝、浅拷贝及Cloneable接口
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
- 五星-原型模式常使用于以下场景--而JAVA中的任何类只要实现了Cloneable标识接口,就可以使用clone方法来进行对象的拷贝
- Java深拷贝除了通过实现Cloneable接口,另外还可以通过序列化实现对象的拷贝。
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- java.lang.Cloneable接口
- java cloneable接口及使用场景
- Java中Cloneable接口
- Java中Cloneable接口的用法
- Java:对象克隆(Clone)及Cloneable接口、Serializable接口详解
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- Java中 Cloneable 、Serializable 接口详解
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- java对象 深度克隆(不实现Cloneable接口)和浅度克隆
- Java中的深克隆和浅克隆——Cloneable接口
- java基础入门补充(002) Cloneable接口 深复制与浅复制
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨