今天在做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()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...
在Java中,`clone`方法为我们提供了一个快速复制对象的方式。通过理解和掌握浅拷贝与深拷贝的概念,我们可以根据具体需求选择合适的方法来实现对象的复制。当涉及到引用类型的复制时,需要特别注意是否需要实现深...
在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...
详细的描述了Java中 clone方法使用
Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....
Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校
在Java中,如果一个类想要支持`clone()`方法,它必须实现`Cloneable`接口。这个接口没有任何方法定义,只作为一个标记接口使用。当尝试对未实现`Cloneable`接口的对象调用`clone()`方法时,会抛出`...
在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...
在Java编程语言中,`Clone`机制是一种对象复制的方式,允许创建一个现有对象的副本。在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy)...
在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象的深拷贝与浅拷贝。本文将深入探讨Java中的`clone`方法及其相关知识点。 首先,`clone`方法是Java `Object`类的一个成员方法,定义为`...
在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下代码创建了一个`PassObj`对象,并通过`objA`引用该对象: ```java PassObj objA = new PassObj(); ``` 这里的`objA`...
clone的用法 希望有帮助,仅供参考 通过例子的分析,可以对克隆的方法有所深入了解
C# 中 Clone 一个对象的值到另一个对象案例 C# 中 Clone 一个对象的值到另一个对象案例是一种常见的编程需求。在这篇文章中,我们将学习如何使用 C# 中的 Clone 方法来复制一个对象的值到另一个对象。 什么是 ...
`clone`方法是Java `Object`类中的一个`protected`方法,这意味着在使用`clone`时,需要考虑以下几个关键点: 1. **什么是`clone`**: 当我们需要创建一个已有对象的精确副本时,就可以使用`clone`方法。它不是...
因此,理解和处理Java代码克隆是软件开发中的一个重要话题。 首先,我们需要理解代码克隆的类型。根据克隆的相似程度,可以分为四种主要类型: 1. **精确克隆(Exact Clone)**:两个代码片段完全相同,包括空格和...
在Java语言中,clone方法是一个非常重要的概念,它允许对象被复制,从而创造出一个新的对象。下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 clone方法顾名思义,就是复制...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个方法来源于`java.lang.Object`类,所有Java类都默认继承了这个方法。本资料"Java中clone方法共6页.pdf.zip"可能包含了关于...
Java 中的 clone() 方法是对象的复制方法,其主要作用是创建一个与原对象相同的新对象。下面将详细介绍 Java 中 clone() 方法的使用方法。 什么是 clone() 方法? clone() 方法是 Java 语言中的一种对象复制方法...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和克隆时。这个方法源自`Object`类,是所有Java类的基类。`clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存...