package samples.technology.reference; class Obj{ String str = "init value"; public String toString(){ return str; } } public class ObjRef { Obj aObj = new Obj(); int aInt = 11; public void changeObj(Obj inObj){ inObj.str = "changed value"; } public void changePri(int inInt){ inInt = 22; } public static void main(String[] args) { ObjRef oRef = new ObjRef(); System.out.println("Before call changeObj() method: " + oRef.aObj); oRef.changeObj(oRef.aObj); System.out.println("After call changeObj() method: " + oRef.aObj); System.out.println("==================Print Primtive================="); System.out.println("Before call changePri() method: " + oRef.aInt); oRef.changePri(oRef.aInt); System.out.println("After call changePri() method: " + oRef.aInt); } } /* * 这段代码的主要部分调用了两个很相近的方法,changeObj()和changePri()。 唯一不同的是它们一个把对象作为输入参数,另一个把 Java中的基本类型int作为输入参数。 并且在这两个函数体内部都对输入的参数进行了改动。看似一样的方法, 程序输出的结果却不太一样。 changeObj()方法真正的把输入的参数改变了, 而changePri()方法对输入的参数没有任何的改变。 从这个例子知道Java对对象和基本的数据类型的处理是不一样的。 和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候, 传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝, 所有的函数体内部的操作都是针对这个拷贝的操作, 函数执行结束后,这个局部变量也就完成了它的使命, 它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。 而在Java中用对象的作为入口 参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用", 这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变 时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。 * * */