结论:java是值传递,只是,
- 对于基本数据类型,传递的是基本类型的量值的拷贝
- 对于引用类型,传递的是该引用所指向的对象在内存中的地址值的拷贝
实参和形参
public static void test(String s){
System.out.println(s);
}
public static void main(String[] args) {
test("sofia");
}
代码块中 s 是形参,main方法中的“sofia”是实参,即
- 实参:函数在调用其他函数时,在被调函数后面的括号中的参数为实参
- 形参:在定义函数时使用的参数
值传递和引用传递
- 值传递: 在调用函数的时候,将实参复制一份之后传递到函数中,在函数中对参数修改,不会修改到实参
- 引用传递:在调用函数的时候,将实参的地址传到函数中,函数中的修改会改变实参
总而言之,是否是值传递,关键在于是否会创建副本(不论是对基本数据类型中的变量创建副本,还是对引用类型中对象的地址创建副本),只要创建了副本就是 值传递
例如
int a = 1;
a = 2
System.out.println(a);
String str = "xiao";
str = "sofia";
System.out.println(str);
- 对于基本数据类型而言,变量值就保存在变量中
- 赋值符号“=”,会直接改变基本数据类型的变量a的值由1变为2
- 赋值符号“=”,会改变引用类型指向内存中的地址(一开始str的值是对象“xiao”在内存中的地址,赋值后str的值是“sofia”在内存中地址并将“xiao”在内存中的地址覆盖掉,但对象“xiao”的值并未发生改变,且未被引用,而没有任何引用的 “xiao”则成为了垃圾,会被垃圾回收机制回收)
|