求教 JAVA中引用传递的问题?

永远的小鱼 2012-04-16 09:53:10
结贴率 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.有没有什么好的解决办法?????


...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
永远的小鱼 2012-04-16
  • 打赏
  • 举报
回复
谢谢你们了 结贴。。。
qybao 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
想简单一点,那就在方法体中不要new ArrayList<User>,如果判断参数为null,就直接抛出异常,就是说参数的非null就交给用户来保证。
[/Quote]
或者可以把list定义为成员变量,当然,根据需求而定,还可以定义为static变量
永远的小鱼 2012-04-16
  • 打赏
  • 举报
回复
只能使用返回值 重新赋值了么。哎

看来也只有这么干了 谢谢你们了
桃园闲人 2012-04-16
  • 打赏
  • 举报
回复
List<User> list = null 这一句将list置成空了,这个值可以通过参数船体到GetUser()方法中,但是在方法中list = new ArrayList<User>();的这一句是实例化不是引用。他只在该方法中生效,是无法通过参数来传递到外面去的,所以你要将GetUser方法修改成返回一个List才行。


qybao 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
这种方法测试 是可以的。 但是这个方法需要设定一个新返回的List类型



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

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

感觉这么干真的很费事!能不能简单点
[/Quote]
想简单一点,那就在方法体中不要new ArrayList<User>,如果判断参数为null,就直接抛出异常,就是说参数的非null就交给用户来保证。
永远的小鱼 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

1、因为 你传进去的list应经初始化了,可以对list进行add,但是没有改变list的引用 ,即list指向的堆内存地址 ,
所以 正常 ;

2、List<User> list = null
GetUser(list);
System.out.println(list.get(0).getUserName);


}

GetUser没有改变list的引用,所以还是nu……
[/Quote]



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



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

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

感觉这么干真的很费事!能不能简单点
qybao 2012-04-16
  • 打赏
  • 举报
回复
首先,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();




dxqrr 2012-04-16
  • 打赏
  • 举报
回复
public void GetUser(List<User> list)
{
if(list==null){// 这里
list = new ArrayList<User>();
}
User user = new User("张三");
list.add(user);

}
因为list==null,然后你又new了一个,这样list指向内存中的另一个对象了,不是原来那个对象了
dracularking 2012-04-16
  • 打赏
  • 举报
回复
形參和實參本身是兩個變量,不是同一個。
可以理解為擁有相同引用的兩個不同變量(引用容器)。

這裡引用沒有得到傳遞。

解決辦法是getter顧名思義得有返回值,然後賦給實參,兩者就擁有了相同的引用。
五哥 2012-04-16
  • 打赏
  • 举报
回复
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 ;
}

永远的小鱼 2012-04-16
  • 打赏
  • 举报
回复
人呢????求解啊

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧