函数参数的传递分为两种:“值传递”和“引用传递”.
“值传递”—传递原参数的拷贝, 基本数据类型参数,都是值传递;函数内部修改此参数,则原数据不变.
“引用传递”—传递原参数本身, 对象参数,则为引用传递(这个是引用地址的拷贝);函数内部修改此参数,则原对象更改.
注意:JAVA中函数参数的传递为值传递。参数为对象时,传递的是原参数引用的拷贝,这个引用的拷贝同样会指向原对象。因此,在函数中对对象参数的修改,能够体现到原对象。
“值传递”—传递原参数的拷贝, 基本数据类型参数,都是值传递;函数内部修改此参数,则原数据不变.
“引用传递”—传递原参数本身, 对象参数,则为引用传递(这个是引用地址的拷贝);函数内部修改此参数,则原对象更改.
注意:JAVA中函数参数的传递为值传递。参数为对象时,传递的是原参数引用的拷贝,这个引用的拷贝同样会指向原对象。因此,在函数中对对象参数的修改,能够体现到原对象。
所以从java对传递参数做副本拷贝的角度来讲:java的传递都是值传递!
Java 编程语言只有值传递参数.
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用.对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用.对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
看下面示例:
package myPage;
public class ChangeTest {
public static void main(String[] args){
String abc = "before";
change(abc);
System.out.println(abc);
}
public static void change(String string){
string = "after change";
}
}
将abc串经change方法修改后打印出来仍然是原来的"before"值,因为对象的传递是指向对象的地址的拷贝,那么,对这个新拷贝的地址再赋值是不会影响到原来的地址的内容。再加上String和Integer等这些都属于final类型,所以它们的值是不可以改变的。
再看下面示例:
package myPage;
public class ChangeTest {
private String abc;
public String getAbc() {
return abc;
}
public void setAbc(String abc) {
this.abc = abc;
}
public static void change(ChangeTest changeTest , String info){
changeTest.setAbc(info);
}
public static void main(String[] args){
ChangeTest test = new ChangeTest();
test.setAbc("before");
change(test, "after change");
System.out.println(test.getAbc());
}
}
第二个例子,我们是将changeTest引用对象交给change方法,而在change方法里会获得一个changeTest引用的拷贝,在change方法里对changeTest引用所指向的对象进行操作,所以changeTest的所指向的对象值会改变。