`
linsea
  • 浏览: 87708 次
  • 性别: 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 编程入门思考

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Java初学者入门教学

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    java联想(中文)

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    JAVA_Thinking in Java

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    testRestAPI:java中测试rest api的一个例子

    克隆上面的 repo 并从该 repo 的根文件夹运行: mvn spring-boot:run 克隆这个 repo 后,从一个单独的 shell 进入这个 repo 的根文件夹并运行: mvn clean install 应该得到类似于以下输出的内容: ---------------...

    Thinking in Java简体中文(全)

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Thinking in Java 中文第四版+习题答案

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    java多人聊天室源码-akka-java-cluster-aware:一个示例AkkaJava项目,演示了一个简单的集群感知actor

    在这个例子中,聊天室中的每个人本质上都是一个简单的演员,遵循一组简单的指令。 此外,每个人都知道聊天室中还有谁,并且所有其他参与者都遵循相同的指令集。 此示例场景类似于感知集群参与者使用的基本方法。 ...

    Think in Java(中文版)chm格式

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Java核心技术II(第8版)

    10.8 一个完整的例子 第六章 高级Swing 6.1 列表 6.1.1 JList构件 6.1.2 列表模式 6.1.3 插入和移除值 6.1.4 值的绘制 6.2 表格 6.2.1 简单表格 6.2.2 表格模型 6.2.3对行和列的操作 6.3 树 6.3.1 简单的树 6.3.2 ...

    java中clone的用法实例

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

    java俄罗斯方块源码-SdlGui:基于SDL2和OpenGl的一个简单的Java启发的C++gui库

    java俄罗斯框源码图形界面 是一个简单的图形用户界面api。 受到java的强烈启发。 外部库 SDL2 ()、SDL2_image、SDL2_ttf、SDL2_mixer 和 glew。 开源 ...例子 ...第三个是俄罗斯方块克隆游戏的一个例子。

    java代码雨源码-rain::cloud_with_rain:一个活生生的例子来说明python的打包、测试、构建和部署

    java代码雨源码 :cloud_with_rain: 雨 一个演示python打包、...一个一个的文件。 宗旨 rain是一个实时且不受阻碍的参考,旨在教育而不是执行。 在线参考 与 pyscaffold 或 cookiecutter 不同,您不必在您的机器上执行

Global site tag (gtag.js) - Google Analytics