java对象的深浅克隆

package CloneTest;

class Dog implements Cloneable{
 private String dname;
 private Integer dage;
 public Dog clone() throws CloneNotSupportedException{
  Dog cloned=(Dog) super.clone();
  return cloned;
  
 }

public String getDname() {
  return dname;
 }

public void setDname(String dname) {
  this.dname = dname;
 }

public Integer getDage() {
  return dage;
 }

public void setDage(Integer dage) {
  this.dage = dage;
 }

@Override
 public String toString() {
  return "Dog [dname=" + dname + ", dage=" + dage + "]";
 }

public Dog(String dname, Integer dage) {
  super();
  this.dname = dname;
  this.dage = dage;
 }

}

class Person implements Cloneable {
 private String name;
 private Integer age;
 private Dog dog;

public Person(String name, Integer age, Dog dog) {
  this.name = name;
  this.age = age;
  this.dog = dog;
 }

public Person clone() throws CloneNotSupportedException {
  Person cloned = (Person) super.clone();
  return cloned;

}

public String getName() {
  return name;
 }

public void setName(String name) {
  this.name = name;
 }

public Integer getAge() {
  return age;
 }

public void setAge(Integer age) {
  this.age = age;
 }

@Override
 public String toString() {
  return "Person [name=" + name + ", age=" + age + ", dog=" + dog + "]";
 }

public Dog getDog() {
  return dog;
 }

public void setDog(Dog dog) {
  this.dog = dog;
 }

}

public class CloneTest {
 public static void main(String[] args) throws CloneNotSupportedException {
  Dog dog1 = new Dog("杨狗", 5);
  Person p1 = new Person("wantao", 20, dog1);
  System.out.println("原对象" + p1.getName() + "他的狗为"
    + p1.getDog().getDname());
  System.out.println("第一次进行克隆:");
  Person p2 = p1.clone();
  System.out.println("克隆对象" + p2.getName() + "克隆狗为"
    + p2.getDog().getDname());
  System.out.println(p1 == p2 ? "克隆对象与原对象为同一个对象" : "克隆对象与原对象为不同对象");
  System.out.println(p1.getDog() == p2.getDog() ? "克隆对象的狗与原对象的狗为同一只狗"
    : "克隆对象的狗与原对象的狗为不同的狗");
  System.out.println("第二次进行克隆");
  Person p3=p1.clone();
  p3.setDog(p1.getDog().clone());
  System.out.println("克隆对象" + p3.getName() + "克隆狗为"
    + p3.getDog().getDname());
  System.out.println(p1 == p3 ? "克隆对象与原对象为同一个对象" : "克隆对象与原对象为不同对象");
  System.out.println(p1.getDog() == p3.getDog() ? "克隆对象的狗与原对象的狗为同一只狗"
    : "克隆对象的狗与原对象的狗为不同的狗");

}

}

原文地址:https://www.cnblogs.com/wantao/p/8543863.html

时间: 2024-08-10 22:05:25

java对象的深浅克隆的相关文章

JAVA对象任意深度克隆clone工具类分享

原文:JAVA对象任意深度克隆clone工具类分享 源代码下载地址:http://www.zuidaima.com/share/1550463408114688.htm package com.zuidaima.n_app.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import jav

JAVA对象的深度克隆

有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合.对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏! 既然用等号和clone()复制对象都会对

Java中对象的深浅克隆之序列化篇

浅复制与深复制的区别浅复制:被复制对象的所有变量都含有与原有对象相同的value而所有的对其他对象引用仍然指向原来对象.浅复制仅仅复制对象而没有复制其引用的对象常见例子 List<Map<String,String>> list1 = new ArrayList<Map<String, String>>(); Map<String,String> map = new HashMap<String, String>(); map.put

java对象比较器和克隆

一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要使用到.那么String类和自定义类能不能使用Arrays.sort()来进行排序呢.下面我们来试试,如下: Java代码 publicclassMystring { publicstaticvoidmain(String[] args) { String []a={"早上","

Java对象的假克隆

public class Employee{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Em

对象的深浅克隆

1. package cn.itcast.copy; /* 对象的克隆 对象的浅克隆: 对象浅克隆要注意的细节: 1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口. 2. Cloneable接口只不过是一个标识接口而已,没有任何方法. 3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把 另外一个对象也克隆一份. 4. 对象的浅克隆也不会调用到构造方法的. 对象的深克隆:

【java对象比较器和克隆】

一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类.我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要使用到.那么String类和自定义类能不能使用Arrays.sort()来进行排序呢.下面我们来试试,如下: public class Mystring { public static void main(String[] args) { String []a={"早上","中午&

java对象的克隆

java对象克隆方式主要有两种:浅克隆和深克隆 首先,不要把对象的克隆和对象的赋值搞混了,看下图 p2 = p1;就是赋值操作,赋值操作只是让被赋值对象指向之前对象的地址,实际上的物理内存是一块,而克隆操作的结果应该是两个对象分别指向内容相同的两块内存.如下就是克隆操作后的状态: 下面说浅克隆和深克隆: 深克隆和浅克隆的区别主要出现在类里有外部类对象时,如下,Person类中有Address类的对象 1 package cn.itcast.copy; 2 3 import java.io.Ser

Java对象克隆了解

1.java接口中有一种空的接口叫标识接口,这种接口值起到标识作用. 2.要实现java对象克隆需要用到Object类的 protected Object clone() throws CloneNotSupportedException    方法,这个方法为protected限定,在本包中,或者不同包的子类中才能访问,并且抛出异常. 3.如果要实现对象克隆首先被克隆的类必须实现Cloneable接口,如果没有实现这个接口,调用clone()方法会抛出 CloneNotSupportedExc