java中String参数传递方式

最近在学习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指向的区域数据。

你可能感兴趣的:(java中String参数传递方式)