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