简介:
如题所言,Java中的基本类型和引用类型,在函数参数传递时采用值传递。
基本类型和引用类型:
基本类型和引用类型都可以看作是对象。对于基本类型,其内存空间是分配在栈上的;而对于引用类型,在堆中分配内存空间外,还在栈上分配了一块空间,用于保存堆中内存空间的首地址,java通过垃圾回收机制进行堆中内存空间的自动垃圾回收。
Java中,无论是基本类型还是引用类型,在函数参数传递时都采用值传递方式。对于要传递的参数,一定要分清楚实际参数(实参)和形式参数(形参),二者具有不同的内存地址。
基本类型的参数传递:
基本类型的参数传递示例:
package demo.test.my;
public class MyCar {
public static void main(String args[]) {
int value = 5;
changeValue(value);
System.out.println("[main]: value=" + value); //输出:[main]: value=5, 实际参数value的值没有被改变
}
public static void changeValue(int value) {
value = 20;
System.out.println("[changeValue]: value=" + value);//输出:[changeValue]: value=20
}
}
/*
[changeValue]: value=20
[main]: value=5
*/
分析:
在changeValue函数中,value是形式参数,在函数内部对于value的操作,其实是对于形式参数的操作。当退出函数作用域时,形参分配的空间被释放,而且,函数作用域外,无法再去访问它。
所以,在函数内部,“value = 20” 修改的是形参的值,并没有对实参由影响。
引用类型的参数传递:
java中,引用类型也是值传递。
引用类型的参数传递示例:
定义一个MyCar类,数据成员value模拟的是“速度”。
package demo.test.my;
public class MyCar {
private float value;
public MyCar(float v) {
this.value = v;
}
public void setValue(float value) {
this.value = value;
}
public float getValue() {
return this.value;
}
public static void main(String args[]) {
MyCar car = new MyCar(80.0f);
changeCarValue(car);
System.out.println("[main]: car=" +car);//输出:[main]: car=demo.test.my.MyCar@511d50c0
System.out.println("[main]: car.value=" + car.getValue());//输出:[main]: car.value=100.0
}
public static void changeCarValue(MyCar car) {
car.setValue(100.0f);
System.out.println("[changeCarValue]: car=" +car);//输出:[changeCarValue]: car=demo.test.my.MyCar@511d50c0
System.out.println("[changeValue]: value=" + car.getValue());//输出:[changeValue]: value=100.0
System.out.println("");
}
}
/*
[changeCarValue]: car=demo.test.my.MyCar@511d50c0
[changeValue]: value=100.0
[main]: car=demo.test.my.MyCar@511d50c0
[main]: car.value=100.0
*/
分析:
对于changeCarValue函数来说,参数car是引用类型,形式参数和实际参数指向同一个对象,因为操作的是同一个对象,所以,在这个函数内对于形式参数car的修改,实际上就是对函数外实际参数car的修改。