class User{}class Test{
   public static void main(String[] args){
      
      List<User> l = new ArrayList<User>();
      l.add(new User());
      
      User user = l.get(0);
      user = null;      System.out.println(l.get(0));
   }
}输入的结果表明List中的引用依旧指向原来的对象, 并没有变成null.
是否说明 从List中获取一个对象时, 得到的是List中保存的引用的一个副本?还想请教一下, 假如在方法内部生成一个对象引用, 然后return出去, 那么return出去的引用与生成的引用是一个, 还是一个副本?

解决方案 »

  1.   

    如果C的指针学得好,就很容易理解这样的问题
    User user = l.get(0);//User user声明一个User指针(java里没有指针,也就相当于一个User变量),然后给user这指针赋值,也就让user指向和l.get(0)一样的地址,这样user的引用值和l.get(0)的引用值是一样的
    user = null;//这里相当于给user指针重新赋值,让user指向null,但是不影响l.get(0)本身的地址,所以l.get(0)的引用值没有任何变化
    引用的副本是C针对引用类型 & 的说法,完全是两码事
    在方法内部生成一个对象引用,return出去的是一个临时的指向该对象引用的指针(也就是java的引用),这个return出去的和生成的引用同时指向(引用)同一个对象