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!
