
正文
java克隆对象代码 java克隆数组
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何克隆Java对象
Java中的对象涉及使用引用类型,没有直接的方法可将一个对象的内容复制到一个新对象中。将一个引用分配给另一个引用只会给相同对象建立另一个引用。因此,Java对所有引用类型使用一个特殊的clone()方法,为对象复制自身提供一个标准的机制。以下是你需要了解和克隆Java对象有关的细节。为何建立一个本地拷贝?给一个对象建立本地拷贝的原因很可能是由于你计划修改该对象,并且你不想修改方法调用者的对象。如果你确定你需要一个本地拷贝,你可以使用Object类的clone()方法来执行这项操作。clone()方法被定义为受保护方法,但你必须在你希望克隆的所有子类中重新公开定义它。例如,标准库类ArrayList忽略clone(),但你可以这样为ArrayList调用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1’s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一个Object,它必须重新转变为适当的类型。这个例子说明ArrayList的clone()方法如何不能自动克隆ArrayList包含的每一个对象?原有ArrayList和克隆后的ArrayList是相同对象的别名。这种情况通常叫做浅拷贝,因为它仅仅复制一个对象的“表面”部分。实际的对象由这个“表面”,引用指向的所有对象,以及那些对象指向的所有对象等构成。这往往被称作“对象网络”。下一页
相关问答
Q1: java编程 克隆一个普通对象,克隆后的对象占有各自的堆内存,克隆一个对象数组,对象数组占有同一个内存
你要看具体的内部实现了 有的直接 另外new 一个肯定是两个不同的堆内存空间 只是把 所有的属性设置成相同 有的克隆 指向同一个对内存就是没有new
Q2: Java 如何复制对象
可以使用clone来实现java克隆对象代码,clone用于为引用类型java克隆对象代码的复制
1.使用clone方法的类必须先实现Cloneable接口,不然clone方法会直接返回CloneNotSupportedException不支持克隆的异常
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现java克隆对象代码了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
Q3: java 对象 克隆
这是里面的一段(非完整的例子):
public class Snake implements Cloneable {
...........................
public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {}
return o;
}
copy书上一段给你看看,希望有帮助把。。
当制作实例变量的一个引用时,原始实例变量和副本实力变量在内存中引用的均是同一个存储空间,这就意味着但对其中一个实例变量操作时就会影响到这个对象的副本。例如下面的程序代码。在执行时将会看到所画的两条线重合在一起,都是改变后的LineFigure1。
LineFigure lineFigure1 = new LineFigure();
LineFigure lineFigure2 = lineFigure1;
lineFigure1.draw(g);
…code for changing lineFigure1
lineFigure2.draw(g);
如果想让LineFigure2成为一个新的对象,就要用到Clone( )方法。Clone的后对象和原对象的存储空间不同,改变其中一个并不会对另一个产生任何影响。例如下面代码所示:
…………….
LineFigure2 = lineFigure1.clone();
…………….
如果LineFigure2中没有对其他对象的引用,事情就到此结束了,但LineFigure类中的实例变量StartPoint和EndPoint都是一个对象,即使简单地实现了对LineFigure1地Clone,可LineFigure1和LineFigure2的StartPoint和EndPoint实例变量引用的是同一个变量,要想完全的实现将LineFigure2和LineFigure1分离开,就要实现Cloneable接口,并重写Clone方法。Cloneable接口是Java提供的少数几个标签化接口之一。平常所说的标签化接口就是不提供任何方法的接口。在图形白板程序中,也用到了Cloneable接口,例如LineFigure类中的代码:
public class LineFigure extends Figure implements Cloneable{
public Object clone(){
LineFigure lineFigure = new LineFigure();
lineFigure.startPoint = (Point)startPoint.clone();
lineFigure.endPoint = (Point)endPoint.clone();
lineFigure.firstDraw = firstDraw;
return lineFigure;
}
………………..
}
这样一来,LineFigure1和LineFigure2所引用的对象就没有任何的重合。对其中任何一个进行修改而不影响另一个的应用。
Q4: 如何进行Java对象的克隆
以数组对象java克隆对象代码的克隆为例。
Java程序java克隆对象代码:
public class Main {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = a.clone(); //b是a的克隆java克隆对象代码,a和b指向不同的数组
int[] c = a; //c是a的引用,a和c指向同一个数组
a[0] = 10;
System.out.println("a[0] = " + a[0]);
System.out.println("b[0] = " + b[0]);
System.out.println("c[0] = " + c[0]);
}
}
运行测试java克隆对象代码:
a[0] = 10
b[0] = 1
c[0] = 10
自定义类的情况如下java克隆对象代码:
public class Main {
public static void main(String[] args) {
A a1 = new A();
a1.name = "Smith";
A a2 = a1;
A a3 = (A) a1.clone();
a1.name = "White";
System.out.println("a1 : " + a1.name);
System.out.println("a2 : " + a2.name);
System.out.println("a3 : " + a3.name);
}
}
class A implements Cloneable {
public String name = null;
@Override
public Object clone() {
A a = null;
try{
a = (A)super.clone();
}
catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return a;
}
}
运行测试:
a1 : White
a2 : White
a3 : Smith
关于java克隆对象代码和java克隆数组的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






