最近在学习java参数值传递与参数传递方式,对于基本类型和引用类型和字符串得到了和预期不一样的效果
1、对于int等基本数据类型:
public static void main(String[] args) {
int num = 1;
change(num);
System.out.println(num);
}
public static void change(int num) {
num =10;
}
得到的结果是:1
对于基本数据类型创建时是存储在stack中的,参数传递时复制一份相同的值num'。在方法中修改的是复制参数的值不会影响在原先的数据。
2、对于引用数据类型:
public static void main(String[] args) {
int[] tem = new int[]{1, 2, 3};
change(tem);
System.out.println(tem[0]);
}
public static void change(int[] s) {
s[0] = 100;
}
得到的结果是:100
对于引用数据类型创建时会在heap中开辟一块空间来存储具体的值,在stack中保存一个tem地址指向heap中具体数据区域。在参数传递时复制一个引用tem',他和tem都指向同一块数据,所以更改会改变tem中的数据。
3、对于String类型:
public static void main(String[] args) {
String s = "嗯哼哼";
change(s);
System.out.println(s);
}
public static void change(String s) {
s += "振振有词";
}
得到的结果是:嗯哼哼
讲道理字符串String是引用类型,却没有像数组那样被修改,很奇怪。
前面说了引用类型在参数传递时会复制一个引用地址s'和s一同指向数据区域(String由于其特殊性不一定存放在heap中)。但是我们在函数中对s'指向的数据(这时候和s指向地址的相同)修改时,因为字符串不可修改会重新建立一个字符串并将s'指向这块区域。所以并没有改变s指向的区域数据。