Java是当今互联网行业中的热门开发语言,在java中,由于没有指针类型,其传参的方式也发生了相应的变化。中培伟业《企业级JAVA高级开发技术实战》培训专家龚老师根指出,java中传参方式应该主要有两种:传值和传引用。
一、传值
java中的传值即传递的是原变量的一个副本。基本的数据类型,如:char,int,double等类型的变量向函数传递的参数,都是变量的副本都属于传值。函数内部不论进行任何操作,都不影响变量本身,影响的只是变量的副本。
二、传引用
从表面上来看,java中的对象类型都是传递的引用,而不是传递的值。然而,java中对象作为实参,传递的实际上还是值,即java中的传参传递的都是值!为什么会这么说?龚老师认为可以从jvm的构成的角度来解释一下自己对这个问题的理解。接下来我们先看一下JVM的结构:
三、JVM的结构及相应的解释
Jvm在实现的时候将属于它的内存分为五部分,其中程序代码(严格的说应当是字节码)和基本的数据类型是放在java栈的栈帧中,而对象是从堆中分配的,堆这个东西龚老师认为可以理解成“对象池”。程序和程序中需要用到的对象放在两个相对独立的区域中,那么程序怎么使用对象呢?实际上是程序中真正使用对象的地方其实只是声明了一个对象的引用,也就是把堆中分配了的相应对象的地址放到引用中,当然引用也是放在栈内存中,栈和堆之间就是通过一个一个的引用来联系的。至于引用,我们可以把它看做是一个指针常量,说白了,就是一个数值,这个数值所表达的是引用对象的地址。所以,不管是基本类型变量(int,float,double等)还是对象,相应的内存地址中存放的都是一个数(无符号整数,整数,浮点数等)。当方法调用时候,方法的参数会占内存中开辟一块新的区域,同时把要传递的基本类型,或者引用类型名称复制到这块内存中,结果是,基本类型(存放在占内存中的)复制之后连同其数值也复制到了这块内存中,而对象只是复制了引用名,实际还要联系到原对象所在的堆区域中。
之所以说java中传递的都是值,是因为传递得是内存地址中的数,当然,这个值对于基本类型和对象类型来说意义是不一样的,对于基本类型这个数就是其值本身,传递值的结果就是,改变新的变量的值不影响旧的变量的值;而对于对象来说这个数是它的地址,传递这个值就相当于传递了真实对象的引用,传递了引用或者说是地址的结果就是变化会全局可见。所以说java中的方法都是按值调用的!只不过基本类型和对象类型的"值"的在具体的机制上作用不同。
综上,java中不论是基本类型还是对象,方法调用时,传递的都是值!
1.对于基本类型的变量,相当于操作其副本。
2.对于对象,相当于复制了一个引用,该引用指向的还是原变量的内存区域。