1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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语言中的指针引用是一样的。当函数体内部对输入变量改变 时,实质上就是在对这个对象的直接操作。
- 除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
- *
- * */
|