函数的形参改变,能改变实际参数吗?
1、数组
函数参数传递数组。====改变形参数组能够改变实参的值。
数组是放在堆中的,本例中arr是数组的引用(值是:数组的首地址),将这个地址赋值给形参后,实参arr和形参arr都是指向堆中的数组的首地址,所以改变形参数组,也就改变了实参的。
数组作为参数是一个特殊的,因为他可以通过首地址,数组名来改变数组中的值。
2、字符串
String str="leixingke";
在编译期,JVM会去常量池来查找是否存在“leixingke”,如果不存在,就在常量池中开辟一个空间来存储“leixingke”;
如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str的空间,来存储“leixingke”在常量池中的地址值指向。
本例实参str是指向常量池中的字符串“leixingke”,将实参str的值赋值给形参str(实际上就是将字符串“leixingke”地址赋值一份给形参str),改变形参str的指向,指向“leixing”,改变形参str和实参str没关系。
3、其他类型
基本数据类型: 一共有8种,可以在栈中直接分配内存;
引用数据类型: 除了基本数据类型以外其他所有的数据类型,比如 Integer 、String、用户自定义的类等他们是对象的引用在栈中,对象实际存放在堆中.
demo
复制收展Javapackage com.algorithm.demo;
import java.util.Arrays;
public class ArrayParamTest {
public static void main(String[] args) {
String str="leixingke";
int a=6;
Integer ai=6;
char[] arr={'a','b','c'};
updateParam(str, a, ai, arr);
System.out.println(str);
System.out.println(a);
System.out.println(ai);
System.out.println(Arrays.toString(arr));
}
public static void updateParam(String str, int a, Integer ai, char[] arr){
str="leixing";
a=10;
ai=11;
arr[0]='z';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59