结贴率 100 啊  求教!以前用过C# 知道C#中有ref out关键字 ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中
我想在java中使用类似传递引用 该怎么实现呢?有人说如果使用自己定义的类型 默认为引用传递 但是我遇到些 问题 废话不多说 上代码
public void GetUser(List<User> list)
{
       if(list==null){
             list = new ArrayList<User>();
       }
       User user = new User("张三");
       list.add(user);}
public static void main(String[] args)throws Exception {
List<User> list = new ArrayList<User>();
GetUser(list);
System.out.println(list.get(0).getUserName);
/*↑经测试 上述代码运行正常 可以正常打印出方法赋予的 张三↑*//*↓经测试 下述代码 报出空指针  这是为何 不是引用传递么?↓*/
List<User> list = null
GetUser(list);
System.out.println(list.get(0).getUserName);
}问题1.这是什么问题 有点不是很懂 求教各位。问题2.有没有什么好的解决办法?????

解决方案 »

  1.   

    1、因为 你传进去的list应经初始化了,可以对list进行add,但是没有改变list的引用 ,即list指向的堆内存地址 ,
    所以 正常 ;2、List<User> list = null
    GetUser(list);
    System.out.println(list.get(0).getUserName);
    }GetUser没有改变list的引用,所以还是null了,你可以改变list中的值 ,但是改变不了list的引用,除非你public List<User>GetUser(List<User> list)
    {
      if(list==null){
      list = new ArrayList<User>();
      }
      User user = new User("张三");
      list.add(user);  return list ;
    }
      

  2.   

    形參和實參本身是兩個變量,不是同一個。
    可以理解為擁有相同引用的兩個不同變量(引用容器)。這裡引用沒有得到傳遞。解決辦法是getter顧名思義得有返回值,然後賦給實參,兩者就擁有了相同的引用。
      

  3.   

    public void GetUser(List<User> list)
    {
      if(list==null){// 这里
      list = new ArrayList<User>();
      }
      User user = new User("张三");
      list.add(user);}
    因为list==null,然后你又new了一个,这样list指向内存中的另一个对象了,不是原来那个对象了
      

  4.   

    首先,java没有像C++那样的引用传递(参数都使用&xxx),从某种意义来讲,java只有值传递
    所以,
    在java中,实参和形参属于两个不同的栈的变量,也就是方法调用的实参和方法体的形参的内存地址是不同的,但是它们的内存中保存的信息相同,对于基本类型变量来说,保存的都是基本的数值信息,对于引用类型变量来说,保存的都是对象的地址public void GetUser(List<User> list) //所以,这里的list和main方法的list是两个不同的变量,
                                              //它们都指向main方法的new ArrayList<User>()对象
    {
      if(list==null){               //所以测试2的时候
      list = new ArrayList<User>(); //这里是改变了GetUser的list指针的指向,
                                         //但是并不改变main方法的list指针的指向
      }
      User user = new User("张三");
      list.add(user); //所以当参数为null的时候,这里的list和main的list指向的对象已经不一样了
                         //main的list指向null对象
                         //而GetUser的list指向GetUser方法体中的new ArrayList<User>()对象
                         //而当参数不为null的时候,因为这里的list和main的list指向的都是main方法中
                         //的new ArrayList<User>()对象,所以在这里修改对象的属性,
                         //在main中也可以看到变化}好的解决方法,可以用返回值
    public List<User> GetUser()
    {
      List<User> list = new ArrayList<User>();
      User user = new User("张三");
      list.add(user);
      return list;
    }在main方法中
    List<User> list = GetUser();
      

  5.   


    这种方法测试 是可以的。 但是这个方法需要设定一个新返回的List类型此方法原本 需要返回一个String的 如果按你这么做的话 我就必须定义一个新的类了 即public class ListMapData{
    String SQL;
    List<User> list = new ArrayList<User>();
    }感觉这么干真的很费事!能不能简单点
      

  6.   

    想简单一点,那就在方法体中不要new ArrayList<User>,如果判断参数为null,就直接抛出异常,就是说参数的非null就交给用户来保证。
      

  7.   

    List<User> list = null 这一句将list置成空了,这个值可以通过参数船体到GetUser()方法中,但是在方法中list = new ArrayList<User>();的这一句是实例化不是引用。他只在该方法中生效,是无法通过参数来传递到外面去的,所以你要将GetUser方法修改成返回一个List才行。
      

  8.   

    或者可以把list定义为成员变量,当然,根据需求而定,还可以定义为static变量