今天用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**()得到这个值?、引用传递 的时候 这一块有什么说道,希望对这一块理解的比较清晰地讲一下啊 

解决方案 »

  1.   

    tell me      why 
    这么多天了 一个回复的都没有  郁闷啊  都来说说啊
      

  2.   

    nodeList = nodeDao.getAccount_NodeList(account); 这里面做了什么?
      

  3.   


    nodeDao.getAccount_NodeList(account);  获取一个 List<NodePO> ;  
    这样写的目的就是想给 nodeList赋值,但只这种方式出了这个方法之后就失效了,nodelist在方法里面
    看到的是有值的,但是出来之后到  action的方法之后 又是空值。
      

  4.   

    你在哪里看nodeList的值的.还是在nodeList = nodeDao.getAccount_NodeList(account); 方法后查看的.理论上可以,而且实验结果也证明可以..
      

  5.   


    nodeList.addAll(nodeDao.getAccount_NodeList(account));
      

  6.   

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

  7.   

    楼主问的就不对
    java里哪来的引用传递
    楼上说的比较清楚了 
    你可以通过这个引用的副本去改变对象的属性值,但无法改变引用的值即引用指向的内存空间
    而你改变引用副本的值只是改变了这个引用副本的指向 和 实参的那个引用没有关系
      

  8.   


    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;
    所以这一块比较迷糊;
      

  9.   


    哦 ,  哎 还是基础不全面啊 ,当年老实讲这一块的时候主要讲的是 String 的变化,后来就只有印象,具体怎么回事不清楚了 。我看了一下我之前的方法, 传进的list 是 用的 .add
    把对象加里面去的,不是用 “=” 。  
    呵呵 谢谢各位了。