ObjRef.java 1.8 KB

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