一、在java函数中,传递参数的时候。参数传递分为基本类型和引用类型。
1、基本类型a作为函数的参数传递时,不管函数中如何修改这个传递的基本类型参数a,都不会影响这个基本类型参数a的值。
例如:基本类型分别为(int, boolean, short, char, float, double, byte, long)
a、这是因为基本类型变量存放在栈中。其实每个函数在线程中运行时,都会给当前线程创建一个虚拟机栈,而虚拟机栈中包含栈帧,栈帧就是我们的每方法,虚拟机栈中栈帧的出栈和入栈就是函数的调用过程。
b、在栈帧中存在一个局部变量表,这个局部变量表就是我们平时说的栈。很显然这里的render()方法有一个栈帧,fullBasic()方法也存在一个栈帧,在调用方法fullBasic的时候传入了2个基本类型的参数。而基本类型参数相当如值传递,那么这里调用fullBasic(a, flag),传入的两个参数相当如在方法fullBasic()中定义了两个基本类型int a = 1和boolean flag = true。这时候fullBasic()方法修改的也就是自己方法中的a和flag所以不会影响上render()方法的a和flag。而且在fullBasic()栈帧被回收时。这两个局部变量也会随着栈帧的消失而被回收,结构类型如下。
2、引用类型user作为函数的参数传递时,是引用传递,函数中修改user值会影响外部函数user对象的值。例如:
a、这里传递引用类型User。new User()的实例对象放在堆中,在fullRefence()方法中得到的参数user是引用传递,而user引用在方法renderTwo的栈帧中,在fullRefence()方法中修改的值,其实就是修改同一个堆中的new User()对象的值。所以外部方法renderTwo()输出的user的名称会改变。
b、这里要注意的是String对象,在java中,我们都知道String也是引用类型。但是为什么我这里在方法fullRefence()修改传入的String对象的值,在外部函数renderTwo()中没有改变呢?
c、string作为传递对象的时候,也是引用传递,但是因为string是不可变类型,所以在调用方法的时候,改变string的值,是相当于在堆里又重新创建了string对象,所以输出结果的时候,方法调用前和方法调用后输出的结果是一致的。即使我这里使用new String(),结果还是一样。