在Java中,一个重要的,而且是每个类都有的方法,clone()。在克隆中,众所周知的一个方面便是深克隆与浅克隆问题。如果是基本数据类型或者String的话,那么简单的浅克隆便可以实现需要的功能。但是当遇到对象类型,包括数组,类等等,则必须使用深克隆的方法来进行。下面举出例子来说明深克隆和浅克隆的区别:
package com.java.lang;
import java.util.Arrays;
public class CLONE implements Cloneable {
private int value;
private int[] array;
private Person person;
public CLONE(int value, int[] array, Person person) {
this.value = value;
this.array = array;
this.person = person;
}
@Override
protected Object clone(){
CLONE o = null;
try {
o = (CLONE)super.clone();
o.person = (Person)this.person.clone();
o.array = new int[this.array.length];
for(int i=0;i<this.array.length;i++){
o.array[i] = this.array[i];
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int[] getArray() {
return array;
}
public void setArray(int[] array) {
this.array = array;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
String result = "";
result += "\tvalue: " + value + "\n";
result += "\tarray: " + Arrays.toString(array) + "\n";
result += "\tperson: " + person.getName();
return result;
}
public static void main(String[] args) {
int[] input1 = {1,2,3,4,5};
Person paul = new Person("paul");
CLONE clone1 = new CLONE(5, input1,paul);
CLONE clone2 = (CLONE)clone1.clone();
System.out.println("clone1:\n" + clone1);
System.out.println("clone2:\n" + clone2);
clone1.getPerson().setName("eric");
System.out.println("clone1:\n" + clone1);
System.out.println("clone2:\n" + clone2);
clone1.getArray()[0] = 0;
System.out.println("clone1:\n" + clone1);
System.out.println("clone2:\n" + clone2);
}
}
class Person implements Cloneable{
private String name = "";
public Person(String name) {
super();
this.name = name;
}
protected Object clone(){
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
结果:
clone1:
value: 5
array: [1, 2, 3, 4, 5]
person: paul
clone2:
value: 5
array: [1, 2, 3, 4, 5]
person: paul
clone1:
value: 5
array: [1, 2, 3, 4, 5]
person: eric
clone2:
value: 5
array: [1, 2, 3, 4, 5]
person: paul
clone1:
value: 5
array: [0, 2, 3, 4, 5]
person: eric
clone2:
value: 5
array: [1, 2, 3, 4, 5]
person: paul
分享到:
相关推荐
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...
Java关于深拷贝(深复制)和浅拷贝(浅复制)比较通俗易懂的简单说明及示例代码...
今天小编就为大家分享一篇关于Java Clone深拷贝与浅拷贝的两种实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
本文将会深入的探讨一下在拷贝对象中会出现的浅拷贝和深拷贝的情况。 拷贝接口 java中所有的对象都是继承自java.lang.Object。Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native ...
主要介绍了Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,需要的朋友可以参考下
java对象的深拷贝和浅拷贝[归类].pdf
Java 对象拷贝是为对象赋值的一种方式,简单来说就是创建一个和原对象相同的对象,新创建的对象是原对象的一个副本,面试官贼拉喜欢在面试的时候问一问你浅拷贝和深拷贝的原理。因为它涉及到对象的引用关系,涉及到 ...
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
本文主要介绍java 的深拷贝和浅拷贝,这里通过实例代码对深拷贝和浅拷贝做了详细的比较,希望能帮到有需要的小伙伴
Java 对象拷贝是为对象赋值的一种方式,简单来说就是创建一个和原对象相同的对象,新创建的对象是原对象的一个`副本`,面试官贼拉喜欢在面试的时候问一问你浅拷贝和深拷贝的原理。因为它涉及到对象的引用关系,涉及...
主要介绍了 java 深拷贝与浅拷贝机制详解的相关资料,需要的朋友可以参考下
对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要...Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)
java深复制浅复制的实现附源代码,并实现java类之间的多对多联系。
变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) 【变量-对象-引用】 在Python中一切都是对象,比如说:3, 3.14, ‘Hello’, [1,2,3,4],{‘a’:1}…… 甚至连type其本身都是对象,type对象 Python...
主要介绍了java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
android 浅复制和深复制-Java Generic Deep Copy 篇
浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程,IDEA搭建
本文实例讲述了javascript二维数组和对象的深拷贝与浅拷贝。分享给大家供大家参考,具体如下: 这篇文章主要为大家详细介绍了js实现数组和对象的深浅拷贝, 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新...
一、为什么有深拷贝和浅拷贝? 这个要从js中的数据类型说起,js中数据类型分为基本数据类型和引用数据类型。 基本类型值指的是那些保存在栈内存中的简单数据段,即这种值是完全保存在内存中的一个位置。包含Number...