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

关于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学习网站大全

    - **Reddit的r/learnjava**:一个Java学习者交流的社区,分享经验、提问答疑。 - **Java-forums.org**:专门讨论Java技术的论坛,可找到大量技术讨论帖。 - **DZone**:发布Java相关的文章和技术资讯,帮助开发者...

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

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

    JAVA常用API文档 中文完整版.zip

    Cloneable接口表示一个对象可以被克隆;Serializable接口则用于对象的序列化和反序列化。 2. **集合框架**:包括List、Set、Map等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。它们提供了数据存储和...

    java课程学习.zip

    这个zip文件包含了一个名为"java-course-learning-java-master"的项目目录,预示着它可能是一个GitHub仓库的克隆,里面可能包含了各种代码示例、练习和项目文件,帮助学习者深入理解Java编程。 Java是一种广泛使用...

    java ee练习代码,基础语法+高级特性 Java学习资料

    在“it_cast-master”这个文件名中,我们可以推测这可能是一个开源项目或者学习资源的仓库,可能是从Git平台如GitHub上克隆下来的。"it_cast"可能是一个组织或个人的标识,而"master"通常是Git仓库的主分支,包含了...

    java2python--java代码转python工具

    Java到Python的转换工具,如标题“java2python”所示,是编程领域中的一种实用技术,旨在帮助开发者将已有的Java代码转换为Python语言。这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定...

    Java入门到精通完整教程+源码.zip

    本资源“Java入门到精通完整教程+源码.zip”提供了一个全面的学习路径,帮助初学者逐步掌握Java编程技能并进阶至精通。下面将详细解析这个压缩包中的学习内容。 首先,"Java1908-master"可能指的是2019年8月的一个...

    设计模式java 版本

    Java中,`java.util.Observer`和`java.util.Observable`接口实现了这一模式。 21. **访问者模式**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...

    Java 的常用包与数组的复制与排序25

    在Java编程语言中,"Java的常用包"和"数组的复制与排序"是学习的基础且重要的部分。这里,我们主要探讨的是Java的核心库包以及如何处理数组,特别是复制和排序的操作。 首先,让我们深入了解Java的常用包。Java标准...

    Java面试指南.pdf

    除此之外,本指南还涉及到了Collection与Collections的区别、IO与NIO的区别、Java中如何实现浅克隆与深克隆以及枚举类型是否可以序列化等问题。每个知识点的解释都不会过于深入,而是倾向于提供快速复习的要点,帮助...

    java设计模式pdf

    通过克隆机制实现了原型模式,并探讨了其在Java中的实现细节。 #### 五、Java基础类库 在第二章(第52页),作者详细介绍了Java基础类库(JFC)的安装和使用方法,并深入探讨了Swing组件的设计理念及其类层次结构...

    java 学习入门 ppt

    这份“java学习入门ppt”提供了一个理想的起点,帮助初学者掌握Java的基础知识,并了解如何与数据库进行交互。以下是对这份资源中可能包含的关键知识点的详细说明: 1. **Java基础**: - **语法特性**:Java语言的...

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

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

    Java设计模式入门闲谈

    在Java中,`java.util.*`包中的`Observable`类和`Observer`接口就是观察者模式的一个典型实现。例如,在实现天气预报系统时,可以使用观察者模式来更新不同类型的天气显示组件。 #### 四、装饰器模式 装饰器模式是...

    最新整理的JAVA学习资料

    Java编程语言是软件开发领域中最受欢迎的编程语言之一,尤其对于初学者来说,它具有良好的可读性、丰富的库支持和广泛的应用场景。这个“最新整理的JAVA学习资料”压缩包,显然是一份专为初学者准备的学习资源,旨在...

    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的30个基本概念 学习Java的30个基本概念

    ### 学习Java的30个基本概念 Java作为一门广泛应用的编程语言,在软件开发、Web应用、移动应用以及各种跨平台系统中扮演着至关重要的角色。为了更好地掌握Java,以下将详细介绍30个基本概念。 #### 1. J2SE、J2EE...

    深入了解Java对象的克隆

    深入探索Java对象的克隆技术,对于每一个热衷于掌握Java编程语言的开发者来说,都是一个...通过深入学习和理解Java对象的克隆,开发者可以更好地掌握Java编程语言的高级特性,从而提升自己在软件开发过程中的实践能力。

Global site tag (gtag.js) - Google Analytics