`
liuwei1981
  • 浏览: 753475 次
  • 性别: Icon_minigender_1
  • 来自: 太原
博客专栏
F8258633-f7e0-30b8-bd3a-a0836a5f4de5
Java编程Step-by...
浏览量:156399
社区版块
存档分类
最新评论

37.值传递

 
阅读更多

在程序中,我们经常需要将一个变量的值赋给另外一个变量,赋值后,两个变量的值相同,那么,在Java中,它是通过值传递的机制来实现的。

 

我们首先来看一个例子。这个例子中的参数是引用类型java.util.Date。

 

import java.util.Date;

public class CallByValueRef {
 public static void main(String args[]) {
  Date d;

  d = new Date();

  System.out.println("d is " + d);
  System.out.println("");

  System.out.println("调用modify()");
  System.out.println("从方法 modify()返回的值");
  // 按值传递参数给modify()
  modify(d);
  System.out.println("");

  System.out.println("d is " + d);
 }

 public static void modify(Date d1) {
  System.out.println("in modify...");

  d1 = null;
  System.out.println("d1 is " + d1);
 }
}

在这个例子中,声明了一个引用类型的变量d,设置它的初始值为当前时间,然后将它的值打印出来。接着,调用方法modify(),它将一个Date引用类型的变量d1改为null,然后方法将修改后的这个变量d1值打印出来,最后,在main()方法中再将d的值打印出来。

 

编译并运行这个程序,可以得到如下的输出:


d is Sun Apr 25 12:06:49 CST 2004

调用modify()
从方法 modify()返回的值
in modify...
d1 is null

d is Sun Apr 25 12:06:49 CST 2004


可以看到,在调用modify()后,d的值并没有发生变化。这是因为,传递给方法modify()的只是d的一个副本(copy),因此在方法中modify()中修改的也只是这个副本的值,而它本身的值并没有发生改变。

 

简单来说,如果传递的变量类型为简单数据类型,那么就是把变量中的值传递过去,相当于这个值的一个副本,进行修改并不会影响到值的原件。

 

而如果传递的变量类型为引用类型数据,仍旧是把变量中的值的一个副本传递过去。要注意的时候,作为引用变量,在变量中存储的值并不是对象本身数据,而是这个对象的引用,即对象存储地址。所以如果修改这个引用副本值,并不会影响到对象本身。

 

但是如果你使用这个引用地址,而去对引用的那个地址的对象进行操作,结果是,对象中的数据真的被改变了!

 

举个例子,对象可以看做是一间房间,数据操作等等都可以看做房间里面的物品。而该对象的引用就是打开这个房间的钥匙。

 

如果进行变量赋值,即值传递,就相当于重新配制了一把钥匙,这把钥匙如果丢了,损坏了,是不会影响最初的那把钥匙,你还是可以拿第一把钥匙打开房间进入房间的。

 

但是如果你拿新配制的钥匙进入了房间,并且对房间里的物品做了变动,就相当于通过引用对对象数据做了修改,即使你拿第一把钥匙进入了房间,房间也是被变更的,因为你们进入的是同一个房间。

 

Java中的参数传递和C++中的参数传递是不一样的。在C++中,传递参数的方式是按照参数类型不同而有所区分的:通过传值的方式来传递简单类型的参数,而通过传引用的方式来传递引用类型的参数。

 

Java中则做了统一处理,去掉了引用类型的传递,即指针操作。

 

实际上在Java中,引用类型的值传递,就是拿对象的引用地址做传递的。但是这些操作的复杂性被统一屏蔽掉了。但是其基本的原理要清楚,在以后的调试中可以及时的发现问题的原因,而不至于茫然无措。

 


 

 

 

分享到:
评论

相关推荐

    C语言深度解剖(完美版).pdf

    第一章关键字............. 37 1.14,struct 关键字..................................................................................................................38 1.14.1,空结构体多大?...................

    彻底搞定C 指针 (完全版 ·修订增补版)

    函数参数传递方式之一:值传递....................................................................................23 3. 函数参数传递方式之二:地址传递...................................................

    Struts in Action中文版

    2. 深入 STRUTS架构..................................................................................37 2.1. 随便谈谈......................................................................................

    C++良好的编程风格.pdf

    前 言 ....................................................................................................................................6 第 1 章 文件结构..............................................

    C#快速入门.doc

    按值传递/输入参数 .............................................24 按引用传递/输入-输出参数 ...............................................24 输出参数....................................................

    C语言深度解剖_word版

    C语言深度解剖 word版 ... 37 1.14,struct 关键字..................................................................................................................38 1.14.1,空结构体多大?.................

    struts in Action

    2. 深入STRUTS 架构..................................................................................37 2.1. 随便谈谈.......................................................................................

    C语言深度解剖

    目 录 第一章 关键字........................................................ 37 1.14,struct 关键字..........................................................................................................

    Excel VBA 基础教程

    目 录 一、VBA语言基础...................................................................................................................1 第一节 标识符....................................................

    EXCEL编程VBA高级教程

    目录 一、VBA语言基础...................................................................................................................1 第一节标识符.....................................................

    C语言深度揭秘

    37 1.14,struct关键字........................................................38 1.14.1,空结构体多大?.......................................38 1.14.2,柔性数组..........................................

    C语言深度剖析 陈正冲

    37 1.14,struct 关键字..................................................................................................................38 1.14.1,空结构体多大?.........................................

    C 语言 深 度 剖析

    37 1.14,struct 关键字..................................................................................................................38 1.14.1,空结构体多大?.........................................

    你必须知道的495个C语言问题(PDF)

    4.7 C 有“按引用传递” 吗? . . . . . . . . . . . . . . . . . . . . . . . 18 4.8 我看到了用指针调用函数的不同语法形式。到底怎么回事? . . . 19 4.9 我怎样把一个int 变量转换为char * 型?我试了类型转换, ...

    Maxima快速参考手册 命令手册 帮助

    Maxima快速参考手册 命令手册 帮助 pdf 目录 1 基本介绍 4 1.1 一点历史 . . . . . ....1.2 启动和退出 ....1.3 在线帮助 ....1.4 数据类型 ....2.1 算术运算 ....2.2 常用初等函数 ....2.3 预定义常数 ....2.4 自定义函数 ....

    高质量C/C++编程(高清扫描版)

    目录 前 言 第 1 章文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2 章程序的版式 ...7.4 指针参数是如何传递内存的? .......................

Global site tag (gtag.js) - Google Analytics