引用传递中的问题 都来看看自己平时怎么写的

hardycheng 2010-07-16 03:14:35
今天用spring的时候发现的:

首先有包 : dao , idao , biz , ibiz

对应 dao 和 biz 都是接口,idao 和ibiz 是其实现。

现在有一个 logonAction;

其中登录方法这样写的:
private AccountPO account = new AccountPO();
private List<NodePO> nodeList = new ArrayList<NodePO>();
private LogonBiz logonBiz ;

public String userLogon(){
if(logonBiz.userLogon(account , nodeList)){
System.out.println(account.getName());
System.out.println(nodeList.size());
return "success";
}else
return "error";
}


其中变量 都有个 getter 和 setter 了 ;

这一块主要是想 通过引用传递 , 通过 biz中的登录业务方法 ,在通过检查登录的时候一并给 action 中 的 account 和
nodeList 赋值。

奇快的事情来了:


LogonBiz :
public interface LogonBiz {

public boolean userLogon(AccountPO account , List<NodePO> nodeList);

}


IlogonBiz :
private LogonDao logonDao ;
private NodeDao nodeDao ;

public boolean userLogon(AccountPO account , List<NodePO> nodeList ) {
try{
if(logonDao.logSuccess(account , nodeList)){
(1) nodeList = nodeDao.getAccount_NodeList(account);
(2) nodeList.addAll(nodeDao.getAccount_NodeList(account));
System.out.println(nodeList.size()); //这一块 nodelist 值是正确的
return true;
}else
return false;
}catch(Exception e){
e.printStackTrace();
return false;
}
}



这一块的问题主要就是

为什么用 nodeList = nodeDao.getAccount_NodeList(account); 这样的方式在回到action 之后 list 被还原,没有传到值 ,但是用 list.addAll() 就能够把值保存出来。

同样 account 用 account = ** 之后回到action之后也没有值,但用 用 account.set**(); 之后回到 action之后可以用
account.get**()得到这个值?、

引用传递 的时候 这一块有什么说道,希望对这一块理解的比较清晰地讲一下啊

...全文
186 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
DAVE_LUO 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lianghaijian 的回复:]
方法的参数只是传递过来的引用的一个副本,这两个引用指向同一个对象,你在这个方法里用'='的赋值方法只是对这个引用副本做了,让这个副本指向了新的对象,原来那个引用是不会变的,但是如果你用addAll方法,是对副本引用所指向的对象进行操作,也就是对原本操作
[/Quote]

受教了,谢谢。
hardycheng 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lianghaijian 的回复:]

方法的参数只是传递过来的引用的一个副本,这两个引用指向同一个对象,你在这个方法里用'='的赋值方法只是对这个引用副本做了,让这个副本指向了新的对象,原来那个引用是不会变的,但是如果你用addAll方法,是对副本引用所指向的对象进行操作,也就是对原本操作
[/Quote]

哦 , 哎 还是基础不全面啊 ,当年老实讲这一块的时候主要讲的是 String 的变化,后来就只有印象,具体怎么回事不清楚了 。

我看了一下我之前的方法, 传进的list 是 用的 .add
把对象加里面去的,不是用 “=” 。
呵呵 谢谢各位了。
hardycheng 2010-07-19
  • 打赏
  • 举报
回复



public class ValueTest {

public static void main(String[] args){
value myV = new value();
System.out.println("================");
myV.setName("456");
System.out.println(myV.getName());
System.out.println("================");
VDao dao = new IvDao();
dao.createV(myV);
System.out.println("================");
System.out.println(myV.getName());
System.out.println("================");
}
}

class value {
private String name = null;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

interface VDao {
public void createV(value v);
}

class IvDao implements VDao {

[code=Java]public void createV(value v) {
value vt = new value();
vt.setName("123");
v = vt;
System.out.println(v.getName());
}

}


[/code]

这段代码运行结果输出
是:

================
456
================
123
================
456
================

也就是说 调用
public void createV(value v) {
value vt = new value();
vt.setName("123");
v = vt;
System.out.println(v.getName());
}
这段代码 之后 myV 的值在最后并没有被改变,而这里我使用的是 v = vt ; 其中的
v 就是引用myV对象。

但是 如果 把这一块的 v = vt 改成 v.setName (vt.getName);

那么运行结果 就是

================
456
================
123
================
123
================

所以 我想问 为什么用 v = vt 这种方式不能修改 参数v对应的对象 myV的值 , 而用 对象的 set 方法则可以修改值;

而且存在问题是 :
使用 v = vt 之后, 用 System.out.println(v.getName); 结果却是 123;
但是 回到 main方法之后 ,再次使用 v.getName() 结果又变成了 456;


所以这一块比较迷糊;
keeya0416 2010-07-19
  • 打赏
  • 举报
回复
楼主问的就不对
java里哪来的引用传递
楼上说的比较清楚了
你可以通过这个引用的副本去改变对象的属性值,但无法改变引用的值即引用指向的内存空间
而你改变引用副本的值只是改变了这个引用副本的指向 和 实参的那个引用没有关系
危险的大猫 2010-07-19
  • 打赏
  • 举报
回复
方法的参数只是传递过来的引用的一个副本,这两个引用指向同一个对象,你在这个方法里用'='的赋值方法只是对这个引用副本做了,让这个副本指向了新的对象,原来那个引用是不会变的,但是如果你用addAll方法,是对副本引用所指向的对象进行操作,也就是对原本操作
「已注销」 2010-07-19
  • 打赏
  • 举报
回复

nodeList.addAll(nodeDao.getAccount_NodeList(account));
危险的大猫 2010-07-19
  • 打赏
  • 举报
回复
你在哪里看nodeList的值的.还是在nodeList = nodeDao.getAccount_NodeList(account); 方法后查看的.

理论上可以,而且实验结果也证明可以..
hardycheng 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lianghaijian 的回复:]

nodeList = nodeDao.getAccount_NodeList(account);

这里面做了什么?
[/Quote]

nodeDao.getAccount_NodeList(account); 获取一个 List<NodePO> ;
这样写的目的就是想给 nodeList赋值,但只这种方式出了这个方法之后就失效了,nodelist在方法里面
看到的是有值的,但是出来之后到 action的方法之后 又是空值。
危险的大猫 2010-07-19
  • 打赏
  • 举报
回复
nodeList = nodeDao.getAccount_NodeList(account);

这里面做了什么?
hardycheng 2010-07-19
  • 打赏
  • 举报
回复
tell me why
这么多天了 一个回复的都没有 郁闷啊 都来说说啊
hardycheng 2010-07-16
  • 打赏
  • 举报
回复
>???? 周五都没人了哦

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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