`
linsea
  • 浏览: 90062 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java 克隆学习的一个例子分析

    博客分类:
  • Java
阅读更多
package aboutclone;
/**
 * JAVA克隆之浅复制(此例来源于《JAVA编程思想》)
 * NOTES:
 * 		类里的基本类型(此例中是 Char c)是深复制,自定义(此例是Snake next)或混合类型(如HashMap,ArrayList等)是浅复制.
 * 		所以深复制时要自己写克隆代码克隆每一个自定义类型(此例是Snake next)或混合类型的字段.
 */
public class Snake implements Cloneable {
	  private Snake next;
	  private char c;
	  // Value of i == number of segments
	  Snake(int i, char x) {
	    c = x;
	    if(--i > 0)
	      next = new Snake(i, (char)(x + 1));
	  }
	  void increment() {
	    c++;
	    if(next != null)
	      next.increment();
	  }
	  public String toString() {
	    String s = ":" + c;
	    if(next != null)
	      s += next.toString();
	    return s;
	  }
	  public Object clone() {
	    Object o = null;
	    try {
	      o = super.clone();
	    } catch (CloneNotSupportedException e) {}
	    return o;
	  }
	  public static void main(String[] args) {
	    Snake s = new Snake(5, 'a');
	    System.out.println("s = " + s);
	    Snake s2 = (Snake)s.clone();
	    System.out.println("s2 = " + s2);
	    
	    System.out.print("s2==s ? ");
	    System.out.println(s2==s);		//false,有深复制基本类型Char,两对象的第一个字段Char不同,
	    								//但第二个引用类型Snake是指向同一对象,下面的打印输出可以看出.
	    
	    System.out.print("s2.c==s.c ? ");
	    System.out.println(s2.c==s.c);//这里深复制了基本类型Char c ,值都是'a',所以为true
	    System.out.print("s2.next==s.next ? ");
	    System.out.println(s2.next==s.next);//这里没有深复制自定类型Snake,复制的是引用,但都是指向同一对象,所以为true
	    
	    s.increment();
	    System.out.println("after s.increment");
	    
	    System.out.print("s2.c==s.c ? ");
	    System.out.println(s2.c==s.c);	//false, s2.c=='a' , s.c=='b'
	    
	    System.out.print("s2.next==s.next ? ");
	    System.out.println(s2.next==s.next);	//true , 浅复制,还是指用同一对象
	    
	    System.out.println(
	      "after s.increment, s2 = " + s2);
	    System.out.println(
	  	  "after s.increment, s = " + s);
	  }
	}



输出如下:
s = :a:b:c:d:e
s2 = :a:b:c:d:e
s2==s ? false
s2.c==s.c ? true
s2.next==s.next ? true
after s.increment
s2.c==s.c ? false
s2.next==s.next ? true
after s.increment, s2 = :a:c:d:e:f
after s.increment, s = :b:c:d:e:f
分享到:
评论

相关推荐

    java的深度克隆的例子

    在Java编程语言中,"深度克隆"是一个重要的概念,主要涉及到对象复制。深度克隆,也称为完全克隆,是指创建一个与原对象相同的新对象,不仅复制原对象的所有属性,还复制了原对象中引用的对象。这通常用于创建一个...

    java 深克隆 浅克隆

    在Java编程语言中,克隆是一种创建对象副本的方法,它允许我们复制一个对象并得到一个与原对象相同但独立的新对象。克隆分为两种主要类型:深克隆和浅克隆。理解这两种克隆的区别是Java面向对象编程中的重要概念。 ...

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    JAVA浅克隆与深克隆

    在Java编程语言中,克隆是创建一个对象副本的过程,这个副本与原对象有相同的属性值,但作为不同的对象存在。克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆...

    Java中的克隆(Clone)机制

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

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    java clone的小例子

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

    深入理解Java中的克隆

    Java中的克隆是一种复制对象的方式,它允许创建一个与原对象具有相同属性的新对象。在Java中,克隆是通过`Object`类的`clone()`方法实现的,但使用克隆时有一些特定的要求和限制。 首先,为了能够克隆一个对象,该...

    Java 23种设计模式及例子

    - **描述**:确保一个类只有一个实例,并提供一个全局访问点。这对于控制资源访问非常有用,比如数据库连接或日志文件。 - **示例**:通过静态内部类实现懒加载单例模式。 4. **建造者模式**(Builder) - **...

    深入JAVA对象深度克隆的详解

    Java对象的深度克隆是一种创建一个新对象的过程,该新对象与原始对象具有相同的数据,但两者之间相互独立,修改其中一个对象不会影响另一个。在Java中,深度克隆与浅克隆的区别在于处理对象内部引用的复杂性。浅克隆...

    java List 深度复制方法

    以下是一个简单的深复制示例,使用了Java的序列化机制: ```java import java.io.*; public class DeepCopyExample { public static <T> List<T> deepCopy(List<T> originalList) throws IOException, ...

    java 对象的克隆(浅克隆和深克隆)

    Java对象的克隆是编程中一个重要的概念,主要用于创建一个对象的新副本,这个副本与原对象具有相同的属性值。在Java中,有两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。接下来,我们将详细...

    Java实现克隆的三种方式实例总结

    Java是一种面向对象的编程语言,克隆是一个重要的概念。克隆可以将一个对象的所有成员变量值复制到另一个对象中。Java提供了三种方式来实现克隆:浅克隆、深克隆和使用Serializable实现深克隆。下面我们将对这三种...

    遍历目录树java源码-Deckard:代码克隆检测;克隆相关的错误检测;语义克隆分析

    Deckard项目,作为一个代码克隆检测工具,利用遍历目录树的方法来查找和分析代码中的克隆现象,即重复的或相似的代码段。在软件开发中,这种重复的代码可能会导致错误蔓延,增加维护成本,因此进行克隆相关的错误...

    设计模式-克隆模式(讲解及其实现代码)

    克隆模式是软件设计模式中的一种结构型模式,它的主要目的是允许对象在不改变原有对象的状态下创建一个功能相同的新对象。这种模式在需要复制复杂对象或者需要避免使用拷贝构造函数时尤其有用。克隆模式的核心思想...

    深入了解Java对象的克隆

    克隆的目的是为了避免对象之间的相互影响,例如,在上面的例子中,我们可以看到 goodsA 和 goodsB 的修改都会影响对方,因为它们指向同一个对象地址。如果我们想要保存一个对象的副本,而不是简单地赋值,那么克隆...

    java设计模式pdf

    特别是,他提到了Java基础类库(Java Foundation Classes, JFC)的作用,这是一个包含大量标准组件的类库,为开发者提供了丰富的工具箱。 #### 四、创建型模式 接下来的部分重点介绍了一系列创建型模式,这些模式...

    MAC下java调用opencv包含opencv_454.jar和libopencv_java454.dylib

    在Mac环境下,使用Java调用OpenCV库是一个常见的需求,特别是在计算机视觉和图像处理的项目中。OpenCV是一个强大的开源库,提供了丰富的功能,用于图像处理、计算机视觉算法以及机器学习。本文将详细介绍如何在Mac上...

    解析JAVA深度克隆与浅度克隆的区别详解

    在Java编程语言中,克隆是创建一个新对象,该对象与原始对象具有相同的状态,但作为不同的实例存在。Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于...

Global site tag (gtag.js) - Google Analytics