java中的参数传递问题

来源:互联网 发布:aⅴ淘宝m7视频 编辑:程序博客网 时间:2024/05/18 16:14

       有一个问题困扰我很久,java中的参数究竟是怎么传递,很多人说java中只有值传递,但我遇到一个问题值传递是无法解释:问题的代码如下,接下来在分析。

  1. public class StrBTest {
  2.  private final StringBuffer info;
  3.  public StrBTest(String name ,String address){
  4.   this.info = new StringBuffer("name:"+name+",address:"+address);
  5.  }
  6.  public StringBuffer getInfo(){
  7.   return info;
  8.  }
  9.  public String toString(){
  10.   return info.toString();
  11.  }
  12. }
    1. public class StrBMain {
    2.     /**
    3.      * @param args
    4.      */
    5.     public static void main(String[] args) {
    6.         // TODO Auto-generated method stub
    7.         StrBTest userInfo = new StrBTest("Alex","Alaska");
    8.         StringBuffer strB = userInfo.getInfo();
    9.         System.out.println(userInfo);
    10.         strB.replace(59"Bob");
    11.         System.out.println(userInfo);
    12.         }
    13. }

输出结果是:

name:Alex,address:Alaska
name:Bob,address:Alaska

        很显然的,在这个过程中,在StrBMain中获取了StingBuffer对象userInfo.info的引用并赋值给了strB,并且改变了它的值,

如果是值传递,那么userInfo中info属性的值就不会发生变化,但是很显然和我们的想法不一样,userInfo中info的值发生了变化,也就说userInfo遭到了破坏,这也就不符合 immutable pattern了。所以我的结论是:

1.java的传递基本类型(如int,long等)的时候是值传递的。

2.java传递一般类(Object的子类)时候是引用传递。

进一步分析:

  1. public class Person {
  2.     private String name;
  3.     private int num;
  4.     public Person(String name, int num) {
  5.         this.name = name;
  6.         this.num = num;
  7.     }
  8.     public void setName(String name) {
  9.         this.name = name;
  10.     }
  11.     public String getName() {
  12.         return name;
  13.     }
  14.     public void setNum(int num) {
  15.         this.num = num;
  16.     }
  17.     public int getNum() {
  18.         return num;
  19.     }
  20.     
  21.     public String toString(){
  22.         return "name :"+name+" , number :"+num;
  23.     }
  24. }
  1. public class StrBMain {
  2.     public static void main(String[] args) {
  3.         Person person = new Person("Dalton",8394);
  4.         System.out.println(person);
  5.         change(person);
  6.         System.out.println(person);     
  7.     }
  8.     
  9.     private static void change(Person person){
  10.         person.setName("Bobby");
  11.     }
  12. }

结果是:name :Dalton , number :8394
name :Bobby , number :8394

程序工作过程:main方法中先实例化了一个Person类,并在控制台输出。

接下来,person传递给change()方法,在change()方法中改变了Person的name属性,这个改变也反映到了person实例中,把person的name属性改变成“Bobby”。这个过程明显是引用传递。

 

而且很明显的,在递归处理时很需要,参数的引用传递的。

 

 

 

以上仅代表个人观点,有错望指出。