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

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#快速入门.doc

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

    0854考研复试 综合面试速成(1):C/C++/Java常识 Akira37.pdf

    - 值传递将实参的值复制给形参,对形参的操作不会影响实参。 - 引用传递将实参的地址赋给形参,对形参的操作直接影响实参。 5. **指针与引用的区别**: - 引用无需显式解引用即可访问对象,而指针需要通过解引用...

    C语言深度解剖

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

    zTree v3.5.37 API 文档

    6. **async**: 异步加载数据的相关设置,如 `url`(数据接口地址)、`type`(请求类型 GET 或 POST)和 `autoParam`(自动传递的参数)等。 **二、zTree 方法详解** zTree 提供了一系列方法来操作和管理树结构,...

    [专升本(国家)考试密押题库与答案解析]专升本生态学基础分类模拟37.docx

    14. **能量传递效率**:要使能量在食物链传递时损失最小,人类应选择能量转化效率高的食物,如谷物,这是生态效率的应用。 15. **生物地球化学循环**:氮循环属于气相型,磷、钙和铁的循环则更多涉及固相或液相。 ...

    Excel VBA 基础教程

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

    C语言深度剖析 陈正冲

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

    高质量C++&C编程指南

    高质量 C++/C 编程指南 目 录 前 言 .................................................................................................................................... 6 第 1 章 文件结构 ................

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

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

    37.基于51单片机的锅炉温控【PT100,热电偶】(仿真).rar

    在本系统中,热电偶被用作另一个电炉的温度传感器,同样经过A/D转换,将信号传递给单片机处理。 为了方便用户操作,系统还配备有按键,允许用户设置所需的加热温度。这些设置值会被单片机存储,并用于比较当前实际...

    高质量c++编程

    37 6.3 函数内部实现的规则.............................................................................................. 39 6.4 其它建议.................................................................

    ETSI ES 201 873-1 V2.2.1(中文版)

    5.2.1 参数传递——传参和传值........................................................................................................................ 21 5.2.1.0 概要....................................

    如何将JS的变量值传递给ASP变量

    asp作为主页面,外接一个js的,我想知道一下能否在js里面调用asp的变量值,如果能这些值是怎么传递过去的呢? 我是这样做的,不知道是不是正确的?在asp这里:[removed][removed] 而在js那边:location.href=’lmsg....

    torch_scatter-2.0.7-cp37-cp37m-win_amd64whl.zip

    例如,scatter_add函数可以将源张量的值分散并累加到目标张量的相应位置,这对于计算图中每个节点的邻居信息总和非常有用。 总结来说,torch_scatter是一个针对PyTorch的扩展库,提供张量散射操作,尤其适用于构建...

    高性能并行计算

    第五章消息传递编程接口MPI 5.1 MPI 简介. . . . . . . . . . . . . . . . . . . . . . . . 59 5.2 MPI 程序实例. . . . . . . . . . . . . . . . . . . . . . 59 第六章MPI 并行环境管理函数. . . . . . . . . ....

    JSP与JS交互问题 值传递

    一、在JSP中访问JS返回的值: 问题: 代码如下:[removed] <!– var str=”123″; <% String aa; %> –> [removed] 怎么让这个JSP里的aa获得JAVASCRIPT中str的值???? 详细一点就是: 代码如下:[removed] ...

    torch_scatter-2.0.6-cp37-cp37m-win_amd64whl.zip

    通过这些层,我们可以高效地处理图数据,实现节点级别的消息传递。例如,在图卷积网络(GCNs)中,`scatter_add`可以用来聚合邻居节点的信息。 总的来说,`torch_scatter`是一个对PyTorch功能的重要补充,尤其在...

Global site tag (gtag.js) - Google Analytics