JAVA中的参数传递全是以值传递的
总的来说,简单概括Java中进行方法调用的时候传递参数时,遵循值传递的原则:
1)基本数据类型,传递的是数据的拷贝 。“值传递”,在这种方式下,被调用对象对新数据的改变不影响源数据的取值,如基本类型的传递
//例1
void method1(){
int x=0;
this.change(x);
System.out.println(x);
}
void int change(int i){
i=1;
}
结果:x=0;
2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身 。被调用对象新数据的改变影响源数据内容,因为新数据和源数据的引用虽然不同但却指向同一数据对象,如类型对象的传递。
void method1(){
StringBuffer x=new StringBuffer("Hello");
this.change(x);
System.out.println(x);
}
void int change(StringBuffer i){
i.append(" world!");
}
结果:x=Hello world;
String是一个比较特殊的数据类型,在Java中,String是一个类,但是他的传值却是采用“值传递”的方式。
首先String不属于8种基本数据类型,String是一个对象。
3.深刻理解引用传递
package AsbstractFactory;
public class Test {
public static void change(StringBuffer i) {
//i值这时和x一样,都指向同一个对象
System.out.println("i值这时和x一样,都指向同一个对象---"+i);
//i和x指向的那个对象值发生变化
i.append(" world!");
System.out.println("i和x指向的那个对象值发生变化--"+i);
//i指向的地方和x不在一样 i=null将i这个引用指向了内存中一个空地址(没任何东西,null)
i=null;
System.out.println(i);
//在堆内存中建新的对象,指向i指向这个新地址
i=new StringBuffer("i指向新的对象");
System.out.println(i);
}
public static void main(String[] args) {
StringBuffer x = new StringBuffer("Hello");
change(x);//引用数据类型,传递的是传递的引用地址的拷贝
System.out.println("输出的还是x指向对象的值----"+x);//输出的还是x指向对象的值,x应用对象的值被改变了一次
}
}
结果:
i值这时和x一样,都指向同一个对象---Hello
i和x指向的那个对象值发生变化--Hello world!
null
i指向新的对象
输出的还是x指向对象的值----Hello world!