`
shuye556
  • 浏览: 946 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java clone时遇到的一个奇怪问题

阅读更多

     今天在做clone实验时遇到一个奇怪的问题,根据《java核心技术第一卷》的叙述,如果一个对象需要clone,而且其内部还存在可变(一般为引用类型)类型的数据,那么这个可变类型的数据在克隆时也需要调用自己的clone方法,如代码中的Employee2中的clone方法中的注释部分,否则为浅度克隆,但是根据自己的实验,在Employee2中的方法并没有调用Date方法中的clone方法(被注释的代码//employee2.hireDay=(Date)hireDay.clone();),但是程序的运行结果表明Date类型已经被深度克隆了,而Employee2中的clone方法中如果不调用的Employee3的clone方法(即employee2.employee3=(Employee3)employee3.clone();),那么employee3对象不会被深度克隆。
      至此,我的问题是为什么java自带的类不需要调用clone方法就能实现深度克隆,而自己写的类必须调用clone方法才能实现此功能,但根据书中的描述,Date类也必须调用自己的clone方法才能深度克隆。希望有朋友能告诉我,谢谢。以下为全部代码:
import java.util.*;
public class CloneTest
{
    public static void main (String[] args) throws CloneNotSupportedException 
    {
        Employee2  harry=new Employee2("Harry Hacke",3500,1989,10,1);
        harry.setEmployee3(new Employee3("Harry Hacke",3500,1989,10,1));
        Employee2 harry2=(Employee2)harry.clone();
        harry2.getEmployee3().setName("yyyyyyyy");
        harry.getEmployee3().setName("yyyyyyyy1111");
        harry.setHireDay(new Date());
        harry.setSalary(5566);
        harry2.setName("ddddd");
        System.out.println (harry);
        System.out.println (harry2);
        System.out.println (harry.getEmployee3().getName());
        System.out.println (harry2.getEmployee3().getName());
    }
}

class Employee2 implements Cloneable   //Employee 继承了SerialCloneable 就有他的克隆方法
{
    @Override
	protected Object clone() throws CloneNotSupportedException {
    	Employee2 employee2=(Employee2)super.clone();
    	//根据书中的描述,Date类也必须调用自己的clone方法才能实现深度克隆,但此处并没有调用hireDay的clone方法竟然也实现了深度克隆
    	//employee2.hireDay=(Date)hireDay.clone();
    	employee2.employee3=(Employee3)employee3.clone();
		return employee2;
	}
	private String name;
    private double salary;
    private Date hireDay;
    public Employee2(String n,double s,int year,int month,int day)
    {
        name=n;
        salary=s;
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
        hireDay=calendar.getTime();
    }
    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireDay()
    {
        return hireDay;
    }
    public String toString()
    {
        return getClass().getName()+"   name:"+name
            +"   salary"+salary
                +"   hireDay:"+hireDay;
    }
    public void lixi(double b)
    {
        double aa=salary*b/100;
        salary+=aa;
    }
	public void setName(String name) {
		this.name = name;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public void setHireDay(Date hireDay) {
		this.hireDay = hireDay;
	}
	Employee3 employee3;
	public Employee3 getEmployee3() {
		return employee3;
	}
	public void setEmployee3(Employee3 employee3) {
		this.employee3 = employee3;
	}
}
class Employee3 implements Cloneable   //Employee 继承了SerialCloneable 就有他的克隆方法
{
    @Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	private String name;
    private double salary;
    private Date hireDay;
    public Employee3(String n,double s,int year,int month,int day)
    {
        name=n;
        salary=s;
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
        hireDay=calendar.getTime();
    }
    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireDay()
    {
        return hireDay;
    }
    public String toString()
    {
        return getClass().getName()+"   name:"+name
            +"   salary"+salary
                +"   hireDay:"+hireDay;
    }
    public void lixi(double b)
    {
        double aa=salary*b/100;
        salary+=aa;
    }
	public void setName(String name) {
		this.name = name;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public void setHireDay(Date hireDay) {
		this.hireDay = hireDay;
	}
}
 
分享到:
评论

相关推荐

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    java_clone用法

    在Java中,`clone`方法为我们提供了一个快速复制对象的方式。通过理解和掌握浅拷贝与深拷贝的概念,我们可以根据具体需求选择合适的方法来实现对象的复制。当涉及到引用类型的复制时,需要特别注意是否需要实现深...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    Java中的clone方法详解_动力节点Java学院

    Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校

    Java深浅clone

    在Java中,如果一个类想要支持`clone()`方法,它必须实现`Cloneable`接口。这个接口没有任何方法定义,只作为一个标记接口使用。当尝试对未实现`Cloneable`接口的对象调用`clone()`方法时,会抛出`...

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    Java Clone(类的复制)实例代码

    在Java编程语言中,`Clone`机制是一种对象复制的方式,允许创建一个现有对象的副本。在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy)...

    关于java clone的一些基本的概念

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象的深拷贝与浅拷贝。本文将深入探讨Java中的`clone`方法及其相关知识点。 首先,`clone`方法是Java `Object`类的一个成员方法,定义为`...

    java中的指针,引用及对象的clone

    在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下代码创建了一个`PassObj`对象,并通过`objA`引用该对象: ```java PassObj objA = new PassObj(); ``` 这里的`objA`...

    java中clone的用法实例

    clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解

    C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf

    C# 中 Clone 一个对象的值到另一个对象案例 C# 中 Clone 一个对象的值到另一个对象案例是一种常见的编程需求。在这篇文章中,我们将学习如何使用 C# 中的 Clone 方法来复制一个对象的值到另一个对象。 什么是 ...

    Java clone方法详解及简单实例

    `clone`方法是Java `Object`类中的一个`protected`方法,这意味着在使用`clone`时,需要考虑以下几个关键点: 1. **什么是`clone`**: 当我们需要创建一个已有对象的精确副本时,就可以使用`clone`方法。它不是...

    java code clone

    因此,理解和处理Java代码克隆是软件开发中的一个重要话题。 首先,我们需要理解代码克隆的类型。根据克隆的相似程度,可以分为四种主要类型: 1. **精确克隆(Exact Clone)**:两个代码片段完全相同,包括空格和...

    Java中的clone方法详解_动力节点Java学院整理

    在Java语言中,clone方法是一个非常重要的概念,它允许对象被复制,从而创造出一个新的对象。下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 clone方法顾名思义,就是复制...

    Java中clone方法共6页.pdf.zip

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个方法来源于`java.lang.Object`类,所有Java类都默认继承了这个方法。本资料"Java中clone方法共6页.pdf.zip"可能包含了关于...

    java 中clone()的使用方法

    Java 中的 clone() 方法是对象的复制方法,其主要作用是创建一个与原对象相同的新对象。下面将详细介绍 Java 中 clone() 方法的使用方法。 什么是 clone() 方法? clone() 方法是 Java 语言中的一种对象复制方法...

    clone()示例源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和克隆时。这个方法源自`Object`类,是所有Java类的基类。`clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存...

Global site tag (gtag.js) - Google Analytics