`
dcriori
  • 浏览: 95361 次
社区版块
存档分类
最新评论

关于java中克隆的学习(一)

阅读更多

    java中的克隆,就是要复制对象,但为什么要用克隆呢?我们直接把对象赋值给其它同类型的实例不就行了吗?这就要从java的值传递和引用传递说起了。

package dcr.study.test.pointer;

public class Obj {
	String str = "init value";

	public String toString() {
		return str;
	}
	
}

 测试值传递和引用传递的代码如下:(注:注释中说明了代码的作用)

package dcr.study.test.pointer;

import java.util.Enumeration;
import java.util.Hashtable;

/*
 * 
 * */
public class ObjRef {
	Obj aObj = new Obj();
	int aInt = 11;

	public void changeObj(Obj inObj) {
		inObj.str = "changed value";
	}

	public void changePri(int inInt) {
		inInt = 22;
	}

	public static void main(String[] args) {
		ObjRef oRef = new ObjRef();

		System.out.println("Before call changeObj() method: " + oRef.aObj);
		oRef.changeObj(oRef.aObj);
		System.out.println("After call changeObj() method: " + oRef.aObj);

		System.out.println("==================Print Primtive=================");

		System.out.println("Before call changePri() method: " + oRef.aInt);
		oRef.changePri(oRef.aInt);
		System.out.println("After call changePri() method: " + oRef.aInt);
		/*
		 * 运行结果如下 Before call changeObj() method: init value After call changeObj()
		 * method: changed value ==================Print Primtive=================
		 * Before call changePri() method: 11 After call changePri() method: 11
		 * 
		 * 方法changeObj(Obj inObj);和方法changePri(int inInt);都是去改变传入的参数值,
		 * 不同的是changeObj(Obj inObj);方法传过的是一个对象,而changePri(int inInt);
		 * 方法传入的却是java的基本类型int,虽然两个方法做了类似的事,但是结果却不一样,传对象
		 * 的方法值被改掉了,但是传java基本类型的方法,值还是原来的值。
		 * 原因是java参数的传递分为两种,值传递和引用传递(不光是java其它语言也一样)。 
		 * 值传递:在java中以 基本类型 和 基本类型的包装类
		 * 做为参数时,都是值传递。 引用传递:以对象做为参数时为引用传递。
		 * 
		 */
		
		System.out.println("==================引用传递=================");
		// 除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"

		ObjRef oRefA = new ObjRef();
		ObjRef oRefB = oRefA;
		oRefA.aObj.str = "改变oRefA的Obj实例的值";
		System.out.println("Print objB.str value: " + oRefB.aObj.str);

		// 此处我们只改变了oRefA 的 Obj实例的str的值,但是oRefB的Obj实例的str的值同时也变了。
		// 说明了在使用 “=” 号向对象变量赋值的时候,也是使用了“引用传递“。

		System.out.println("=============引用传递导致的麻烦=============");
		// 下面是关于HashTable的一个例子,HashTable真的能存储对象吗?
		Hashtable ht = new Hashtable();
		StringBuilder sb = new StringBuilder();

		sb.append("abc");
		ht.put(1, sb);
		sb.append("def");
		ht.put(2, sb);
		sb.append("ghi");
		ht.put(3, sb);
		sb.append("xyz");
		ht.put(4, sb);
		
		int numObj = 0;
		Enumeration it = ht.elements();
		while (it.hasMoreElements()) {
			System.out.print("get StringBufffer " + (++numObj)
					+ " from Hashtable: ");
			System.out.println(it.nextElement());
		}
		/*
		运行结果如下:
		=============引用传递导致的麻烦=============
		get StringBufffer 1 from Hashtable: abcdefghixyz
		get StringBufffer 2 from Hashtable: abcdefghixyz
		get StringBufffer 3 from Hashtable: abcdefghixyz
		get StringBufffer 4 from Hashtable: abcdefghixyz
		而不是我们期望的
		=============引用传递导致的麻烦=============
		get StringBufffer 1 from Hashtable: abcdefghixyz
		get StringBufffer 2 from Hashtable: abcdefghi
		get StringBufffer 3 from Hashtable: abcdef
		get StringBufffer 4 from Hashtable: abc		
		原因就是引用的传递
		如果在向Hashtable put的时候在 sb的后面加上toString()方法,则可以得到
		我们想要的结果。如:ht.put(1,sb.toString());因为java中基本类型和
		基本类型的包装类都是值传递。
		*/
	}
	
}

 

分享到:
评论

相关推荐

    java 深克隆与浅克隆

    学习java深克隆与浅克隆,希望对你有用

    java代码-使用java解决克隆问题的源代码

    java代码-使用java解决克隆问题的源代码 ——学习参考资料:仅用于个人学习使用!

    实例分析java对象中浅克隆和深克隆

    在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。

    C#和JAVA的比较

    然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品。事实是否是这样的呢? 本文的比较结果表明,C#不止是Java的同胞那么简单。如果你是一个Java开发者,想要...

    Thinking in Java简体中文(全)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    java联想(中文)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

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

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的...

    java最新面试题50道精讲

    1 、解释一下什么是Java中的对象克隆,以及如何实现? 2 、解释一下Java中的多态性是什么,以及它如何实现? 3 、解释一下Java中的异常处理机制,以及如何处理异常? 4 、解释一下Java中的集合框架是什么,以及它有...

    java 编程入门思考

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    本科毕业设计项目,java课程设计,使用Vue+SpringBoot开发的图书管理系统,web全栈开发,适合个人学习、参考

    一套完整的增删改查,适合初学者克隆学习并长期增强维护。(前端代码打包后继承在了SpringBoot中) 安装 需要一个叫做book的数据库,sql我已经上传在根目录, 自行导入,修改application.yml中的数据库连接配置。 ...

    java——让学员少走弯路

    Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,Java语言的基本数据类型和Java的语句。 Java中包的概念,类的说明符、方法的说明符、对象...

    C#和 Java比较

    然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品。事实是否是这样的呢? 本文的比较结果表明,C#不止是Java的同胞那么简单。如果你是一个Java开发者,想要...

    Java中对象的序列化方式克隆详解

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走...这篇文章主要给大家介绍了Java中对象的序列化方式克隆,需要的朋友可以参考借鉴,下面来一起看看吧。

    Java初学者入门教学

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Java经典编程源码基础例程300.zip

    Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 ...

    java_intro:一种有趣的基于挑战的方法,用于学习Java基础

    使用docs和stackoverflow学习一种新语言 如何创建,编译和运行Java程序 这里有什么 术语和资源 什么是Java及其运作方式 设定说明 Java某些数据类型简介 循环简介 Java中的Fizzbuzz 使用JUnit的Java TDD简介 奖励:...

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    基于JAVA的搜索引擎 lucene-2.2.0

    在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...

    JAVA_Thinking in Java

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

Global site tag (gtag.js) - Google Analytics