java 函数传引用参数的理解

来源:互联网 发布:ug nx11编程新功能 编辑:程序博客网 时间:2024/06/01 07:55

// 记住:不管引用怎么变,只要不调用该引用的方法,该引用所指的对象的任何属性都不会变。

public class Book{private String name;public Book(String str){name=str;}public Book(){}public Book(Book b1){name=b1.getName();} public String getName(){return name;}public void setName(String str){name=str;}public static void swap1(Book b1, Book b2)               {      Book tmp=new Book();      tmp=b1;      b1.setName(b2.getName());      b2.setName(tmp.getName());      }            public static void swap2(Book b1, Book b2)               {      Book tmp=new Book(b1);      //tmp=b1;      b1.setName(b2.getName());      b2.setName(tmp.getName());      }public static void main(String[] args){   //swap    Book b1=new Book("b1");    Book b2=new Book("b2");    //swap(b1,b2);    swap2(b1,b2);    System.out.println(b1.getName());    System.out.println(b2.getName());     System.out.println("Swap complished!");       swap1(b1,b2);    System.out.println(b1.getName());    System.out.println(b2.getName()); }}


程序执行的结果:

b2
b1
Swap complished!
b1
b1

在利用swap2函数时,我们完成了交换,为什么使用swap1没有完成交换那。

对于swap1()

public static void swap(Book b1, Book b2)         
      {       //因为参数是对象,所以传递时传递的是引用:引时b1,b2的引用地址和主main()函数中的是一样的。
      Book tmp=new Book();            // 此时我们的tmp是别外一个对象,有自己的引用地址。
      tmp=b1;   //                        此时,tmp引用的值变成了b1引用的地址。所以在下面执行中,对tmp的改变和对b1的改变是一样  的。因为两者指向对像是同一个地址。
      b1.setName(b2.getName());
      b2.setName(tmp.getName());    //此时tmp和b1是一致的,所以我们完不成交换。即我们的创建的临时变量并没有起到作用。

所以,要想创建的临时变量起作用,那么我在创建临时变量时就把要交换的数据给初始化上去。所以利用swap2()就可以完成了。
      }


0 0