Java基础之值传递,引用传递

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/swjtu2014112194/article/details/85112239

值传递

8种基础类型是值传递。
在这里插入图片描述
传递的是副本,方法里的参数被修改不影响原数据。

引用传递

类,接口,数组是引用传递。

传递的是对象所在的内存地址,将内存地址拷贝一份,然后作为值传递给参数。

引用对象的实际内容可以被改变,但是引用对象的地址不会改变(因为内存地址是值传递,形参改变了不影响实参)。

引用传递中的不可变类

public class Test{
    public static void change(String s){
        s = "world";
    }

    public static void main(String[] args){
        String s = "hello";
        change(s);
        System.out.print(s);
    }
}

结果:hello

为什么是引用传递却看起来像值传递呢?
因为String是不可变类,当方法想改变内存地址存储的实际内容时,会生成一块新的内存,将“world”存储进去,然后方法中的s引用这块内存“world”。但是原来的s引用对象是不会变的,还是引用原来的内存“hello”。

引用传递实例

public class Test{
    public static void change(StringBuffer s1,StringBuffer s2){
        s1.append("world");
        s2 = s1;
    }

    public static void main(String[] args){
        Integer a = 1;
        Integer b = a;
        b++;
        System.out.println(a);
        System.out.println(b);

        StringBuffer s1 = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hello");
        change(s1,s2);
        System.out.println(s1);
        System.out.println(s2);
    }
}

结果:
1
2
helloworld
hello
Integer是不可变类,刚开始b和a指向同一块内存地址,但是当要b修改内存地址里面的内容时,因为不能修改,所以新建一块内存地址,b指向它。所以b和a没有关系了。

StringBuffer不是不可变类,调用过程如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/swjtu2014112194/article/details/85112239
今日推荐