版权声明:本文为博主原创文章,未经博主允许不得转载。 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不是不可变类,调用过程如下: