天天看点

JAVA中方法参数的引用传递

当一个对象被当作参数传递到一个方法”,这就是所谓的按引用传递。

Java代码  

  1. public class User {  
  2.     private String name;  
  3.     public String getName() {  
  4.         return name;  
  5.     }  
  6.     public void setName(String name) {  
  7.         this.name = name;  
  8. }  

Java代码  下载

  1. public class Test {  
  2.     public void set(User user){  
  3.         user.setName("hello world");  
  4.     public static void main(String[] args) {  
  5.         Test test = new Test();  
  6.         User user = new User();  
  7.         test.set(user);  
  8.         System.out.println(user.getName());  

 上面代码的输出结果是“hello world”,这不必多说,那如果将set方法改为如下,结果会是多少呢?

  1.  public void set(User user){  
  2.     user.setName("hello world");   
  3.     user = new User();   
  4.     user.setName("change");   
  5.   }  

   答案依然是“hello world”,下面就让我们来分析一下如上代码。

 首先:

  1. User user = new User();  

   是在堆中创建了一个对象,并在栈中创建了一个引用,此引用指向该对象,如下图:

  1. test.set(user);  

   是将引用user作为参数传递到set方法,注意:这里传递的并不是引用本身,而是一个引用的拷贝。也就是说这时有两个引用(引用和引用的拷贝)同时指向堆中的对象,如下图:

  1. user.setName("hello world");  

   在set()方法中,“user引用的拷贝”操作堆中的User对象,给name属性设置字符串"hello world"。如下图:

  1. user = new User();  

   在set()方法中,又创建了一个User对象,并将“user引用的拷贝”指向这个在堆中新创建的对象,如下图:

  1. user.setName("change");  

   在set()方法中,“user引用的拷贝”操作的是堆中新创建的User对象。

   set()方法执行完毕,目光再回到mian()方法

System.out.println(user.getName());      

继续阅读