在程序中,我们经常需要将一个变量的值赋给另外一个变量,赋值后,两个变量的值相同,那么,在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中,引用类型的值传递,就是拿对象的引用地址做传递的。但是这些操作的复杂性被统一屏蔽掉了。但是其基本的原理要清楚,在以后的调试中可以及时的发现问题的原因,而不至于茫然无措。
分享到:
相关推荐
按值传递/输入参数 .............................................24 按引用传递/输入-输出参数 ...............................................24 输出参数....................................................
- 值传递将实参的值复制给形参,对形参的操作不会影响实参。 - 引用传递将实参的地址赋给形参,对形参的操作直接影响实参。 5. **指针与引用的区别**: - 引用无需显式解引用即可访问对象,而指针需要通过解引用...
目 录 第一章 关键字.................................................................................. 37 1.14,struct 关键字..............................................................................
6. **async**: 异步加载数据的相关设置,如 `url`(数据接口地址)、`type`(请求类型 GET 或 POST)和 `autoParam`(自动传递的参数)等。 **二、zTree 方法详解** zTree 提供了一系列方法来操作和管理树结构,...
14. **能量传递效率**:要使能量在食物链传递时损失最小,人类应选择能量转化效率高的食物,如谷物,这是生态效率的应用。 15. **生物地球化学循环**:氮循环属于气相型,磷、钙和铁的循环则更多涉及固相或液相。 ...
目 录 一、VBA语言基础...................................................................................................................1 第一节 标识符....................................................
37 1.14,struct 关键字..................................................................................................................38 1.14.1,空结构体多大?.........................................
4.7 C 有“按引用传递” 吗? . . . . . . . . . . . . . . . . . . . . . . . 18 4.8 我看到了用指针调用函数的不同语法形式。到底怎么回事? . . . 19 4.9 我怎样把一个int 变量转换为char * 型?我试了类型转换, ...
在本系统中,热电偶被用作另一个电炉的温度传感器,同样经过A/D转换,将信号传递给单片机处理。 为了方便用户操作,系统还配备有按键,允许用户设置所需的加热温度。这些设置值会被单片机存储,并用于比较当前实际...
37 6.3 函数内部实现的规则.............................................................................................. 39 6.4 其它建议.................................................................
5.2.1 参数传递——传参和传值........................................................................................................................ 21 5.2.1.0 概要....................................
asp作为主页面,外接一个js的,我想知道一下能否在js里面调用asp的变量值,如果能这些值是怎么传递过去的呢? 我是这样做的,不知道是不是正确的?在asp这里:[removed][removed] 而在js那边:location.href=’lmsg....
例如,scatter_add函数可以将源张量的值分散并累加到目标张量的相应位置,这对于计算图中每个节点的邻居信息总和非常有用。 总结来说,torch_scatter是一个针对PyTorch的扩展库,提供张量散射操作,尤其适用于构建...
第五章消息传递编程接口MPI 5.1 MPI 简介. . . . . . . . . . . . . . . . . . . . . . . . 59 5.2 MPI 程序实例. . . . . . . . . . . . . . . . . . . . . . 59 第六章MPI 并行环境管理函数. . . . . . . . . ....
一、在JSP中访问JS返回的值: 问题: 代码如下:[removed] <!– var str=”123″; <% String aa; %> –> [removed] 怎么让这个JSP里的aa获得JAVASCRIPT中str的值???? 详细一点就是: 代码如下:[removed] ...
通过这些层,我们可以高效地处理图数据,实现节点级别的消息传递。例如,在图卷积网络(GCNs)中,`scatter_add`可以用来聚合邻居节点的信息。 总的来说,`torch_scatter`是一个对PyTorch功能的重要补充,尤其在...