本帖最后由 王舜民 于 2012-9-4 23:40 编辑
public class Test1 {
public static void main(String[] args) {
String s = "abc";
change(s);
// System.out.println(a);
}
public static void change(String s) {
s ="efg"; //其实这边只是把“abc”拷贝了一份,而没有改变主函数 s的值
System.out.println(s);
}
}
这个是转载别人的,顺便练一下自己的解说能力。http://blog.csdn.net/wasaitufu/article/details/7027495
值传递和引用传递的区别,这个问题在刚毕业参加的几次面试都遇到过,经过半年的工作之后,对此有了一定了解。
相同点:值传递和引用传递都指的是对于方法中形式参数的赋值
不同点:值传递的实际参数是基本类型数据,引用传递的实际参数是引用类型(String、数组、对象等)
值传递的是基本类型数据,所以在参数传递时,是将其存在栈中的值赋给了形式参数,我们知道基本类型数据是存在栈中,栈的一个重要特殊性就是数据可以共享,在栈中可以有不同的变量指向同一个值,在这里就是实际参数变量和形式参数变量在栈中指向了同一个值,在方法执行当中如果形式参数的值发生改变,指向了栈中另一个值,这时并不影响实际参数在栈中的指向,它仍然指向原来的值,而这时栈中有两个变量分别指向两个值。所以说值传递中形式参数的改变不会影响实际参数的值。(对于网上的一种说法,值传递相当于传递了实际参数值的副本,我觉得不是很恰当)
引用传递的是引用类型数据,也称地址传递,是将实际参数在栈中的引用(也就是对象在堆内存中的首地址)赋值给了形式参数,所以对于引用类型数据,存在栈中的引用指向存放在堆中的对象(String类型如果不是new出来的会指向常量池),参数传递之后意味着实际参数和形式参数的值指向了堆中的同一个对象,而方法在执行过程中对于形式参数的改变(例如改变此对象的一个属性),这时实际他们所指向的同一个对象已经发生了变化,
如下简单例子体会引用传递前后对象a的变化:
public class Test {
public static void main(String[] args) {
Value v=new Value();
v.i=25;
int i=5;
second(v,i);
System.out.println(v.i+"&"+i);
}
public static void second(Value v,int i){
v.i=0;
Value v2=new Value();
i=0;
v=v2;
System.out.println(v.i+"&"+i);
}
}
class Value{
public int i=15;
}
输出结果: 15&0
0&5
|