结贴率 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.有没有什么好的解决办法?????
我想在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.有没有什么好的解决办法?????
解决方案 »
- 什么是集群,什么是负载均衡,他们2者的关系是什么啊。
- Java EE 和Java Web 有什么区别和联系?
- struts 2 如何在JAVA中实现页面跳转
- 遇到一个奇怪问题,请各位大侠帮帮忙
- An error occurred while evaluating custom action attribute "value" with value "${managePageForm.mPPageName}": Unable to find a v
- hibernate中hql的where条件为中文问题
- xfire webservice 乱码
- javamail发送带图片的html信件,图片怎么显示不出来?
- 从网上找了一个Struts分页的例子,但是运行出错“javax.servlet.jsp.JspException: No bean found under attribute key page”
- 在线等待!请文中怎么使用WebLogc的类加载器加载一个类?
- 监控weblogic出错
- struts2.3.1.2中使用<sx:tree>标签生成动态树形结构的问题
所以 正常 ;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顧名思義得有返回值,然後賦給實參,兩者就擁有了相同的引用。
{
if(list==null){// 这里
list = new ArrayList<User>();
}
User user = new User("张三");
list.add(user);}
因为list==null,然后你又new了一个,这样list指向内存中的另一个对象了,不是原来那个对象了
所以,
在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();
这种方法测试 是可以的。 但是这个方法需要设定一个新返回的List类型此方法原本 需要返回一个String的 如果按你这么做的话 我就必须定义一个新的类了 即public class ListMapData{
String SQL;
List<User> list = new ArrayList<User>();
}感觉这么干真的很费事!能不能简单点