下面有一个代码非常好帮助理解
我的理解是:
引用在栈中,存储变量堆地址。实际变量在堆中。引用指向变量。
方法参数传递的是堆中地址的值(其实也是栈中变量存储的值),是直接指向堆中对象的,是同一个变量。所以更改操作会影响。
如果引用又指向了一个新开辟的变量地址。就不会影响原地址的对象。
如果另一个引用指向了之前的变量地址并修改,那么也会改变该地址对象的值。
所以,看对象有没有改变,实际上是看堆中该地址存储的值有没有改变!
public static void main(String[] args)
{
StringBuffer s= new StringBuffer("good");
StringBuffer s2=new StringBuffer("bad");
test(s,s2);
System.out.println(s);//9
System.out.println(s2);//10
StringBuilder sb = new StringBuilder("iphone");
}
static void test(StringBuffer s,StringBuffer s2) {
System.out.println(s);//1
System.out.println(s2);//2
s2=s;//3 s2=s=good
s=new StringBuffer("new");//4 s=new
System.out.println(s);//5 new
System.out.println(s2);//6 good
s.append("hah");//7 s=newhah
s2.append("hah");//8 s2=goodhah
}
代码输出
good
bad
new
good
goodhah
bad
值传递:基本类型都在栈中,作为方法变量时传递的是变量的副本。完全不影响。
网友评论