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中基本类型和

基本类型的包装类都是值传递。

*/

}

}

分享到:

2009-05-26 10:53

浏览 757

评论

java 克隆的作用_关于java中克隆的学习(一)相关推荐

  1. java 线程组作用_浅析Java中线程组(ThreadGroup类)

    一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...

  2. java枚举对象作用_浅析Java编程中枚举类型的定义与使用

    定义枚举类型时本质上就是在定义一个类,只不过很多细节由编译器帮您补齐了,所以某些程度上,enum关键字的 作用就像是class或interface. 当您使用"enum"定义枚举类 ...

  3. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  4. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  5. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...

    简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...

  6. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  7. java中 jacob作用_【JAVA】JACOB使用简介

    它允许在java中调用com接口自动组件,它使用JNI(本地调用程序)来进行本地调用COM库.它可运行在x86和支持32位和64位Java虚拟机 X64的环境. 测试源码包: 密码: ej9u JAC ...

  8. java 异常处理发生异常_处理Java中的异常

    java 异常处理发生异常 每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 在Jav ...

  9. java 栈的变量_深入Java核心:JVM中的栈和局部变量

    操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组.但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的.可把操作数栈理解为存储计算时,临时数据的存储区域.下面我们通过 ...

最新文章

  1. OpenCV学习笔记(一) 环境配置
  2. Python基础语法学习(字符串)
  3. 开始把其他的博客搬家到这里了
  4. oracle快捷语句框架中,Oracle框架:PL/SQL编程:
  5. thinkcmf ajax,thinkcmfx 中如何用jquery ajax提交数据,自己尝试去做之后,还是没法提交,求助!...
  6. Program to reverse the digits of a number
  7. 1到10所有数字相加求和
  8. [转载] python enumerate函数 实例_python中使用enumerate函数遍历元素实例
  9. hue 安装 + authrization manager安装
  10. C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
  11. python自定义函数的参数调用_python | 自定义函数
  12. 经纬度坐标转换成px_经纬度坐标转换为百度坐标
  13. microsoft office 文档左边导航窗格列表不见了
  14. 解决es集群Yellow与Red的问题
  15. LeetCode1153 字符串转化
  16. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 python实现
  17. 3.1 埃拉托色尼筛选
  18. 测试人员想做游戏测试,你一定要知道这几点!
  19. 方框滤波(Box filtering)
  20. 二十一世家赚钱之门路-----小投资大生意

热门文章

  1. 读书-算法《程序设计导引及在线实践》-简单计算题5:装箱问题
  2. 使用DELPHI编写一个小的控件
  3. 网页直播中推流组件EasyRTM推送RTMP扩展支持HEVC(H265)
  4. Ubuntu上snmp安装、配置、启动及远程测试完整过程
  5. linux下防火墙加白名单
  6. 网络协议档案之ICMP、Ping、Traceroute
  7. linux命令之查看进程运行动态库依赖及打开文件-lsof
  8. C/C++运行时库 解释
  9. Javascript - Vue - webpack
  10. Fragment 退出动画导致fragment退出失败问题(罕见问题)