对于java中引用类型的传递一直不太清楚,专门写一下防止忘记。
首先新建了一个TestPass的类,里面只有一个整型的成员变量a,而且是用public修饰的。

其他啥都没写,简单纯粹。
OK,然后在Main类里面写了一个静态的changePass方法如下:

这个方法就是新建一个对象testPass1,这个对象中的a赋值为5,然后将新建的对象赋给传进来的testPass,然后在main函数中如此操作:

新建一个TestPass的对象testPass,a赋值为3,然后调用changePass方法,输出调用之后testPass的a的值为:

然后我们队changePass的方法稍加修改:

main函数不变,输出的结果就变成了5。
所以分析下来java方法中变量的传递是值的传递,即将变量复制了一份传到方法中去。
我们再来看看对象在java虚拟机中的存储情况,以Hotspot虚拟机为例,采用的是直接引用法:

这里的reference就是引用类型,类似于C中的指针,在这里就是表示为testPass变量
那么在当前这个例子中的体现就是这样:

将testPass的引用复制了一份传给了changePass,这个副本同样指向堆中的testPass对象,本文中第一版的changePass是对testPass引用的副本进行操作,对引用的原本和对象不产生印象。第二版的changePass是对引用指向的对象的操作,所以testPass原版指向的对象中的a的值也会改变。
综上,java方法中采用的是传值方式,传递的方式是传值,传递的是对象的引用。
网友评论