日期:2014-05-19  浏览次数:20577 次

求教 JAVA中引用传递的问题?
结贴率 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、因为 你传进去的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 ;
}


------解决方案--------------------
形參和實參本身是兩個變量,不是同一個。
可以理解為擁有相同引用的兩個不同變量(引用容器)。

這裡引用沒有得到傳遞。

解決辦法是getter顧名思義得有返回值,然後賦給實參,兩者就擁有了相同的引用。
------解决方案--------------------
public void GetUser(List<User> list)
{
if(list==null){// 这里
list = new ArrayList<User>();
}
User user = new User("张三");
list.add(user);

}
因为list==null,然后你又new了一个,这样list指向内存中的另一个对象了,不是原来那个对象了
------解决方案--------------------
首先,java没有像C++那样的引用传递(参数都使用&xxx),从某种意义来讲,java只有值传递
所以,
在java中,实参和形参属于两个不同的栈的变量,也就是方法调用的实参和方法体的形参的内存地址是不同的,但是它们的内存中保存的信息相同,对于基本类型变量来说,保存的都是基本的数值信息,对于引用类型变量来说,保存的都是对象的地址
Java code

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中也可以看到变化

}

------解决方案--------------------
探讨
这种方法测试 是可以的。 但是这个方法需要设定一个新返回的List类型



此方法原本 需要返回一个String的 如果按你这么做的话 我就必须定义一个新的类了 即

public class ListMapData{
String SQL;
List<User> list = new ArrayList<User>();
}

感觉这么干真的很费事!能不能简单点

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