今天用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**()得到这个值?、引用传递 的时候 这一块有什么说道,希望对这一块理解的比较清晰地讲一下啊
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**()得到这个值?、引用传递 的时候 这一块有什么说道,希望对这一块理解的比较清晰地讲一下啊
这么多天了 一个回复的都没有 郁闷啊 都来说说啊
nodeDao.getAccount_NodeList(account); 获取一个 List<NodePO> ;
这样写的目的就是想给 nodeList赋值,但只这种方式出了这个方法之后就失效了,nodelist在方法里面
看到的是有值的,但是出来之后到 action的方法之后 又是空值。
nodeList.addAll(nodeDao.getAccount_NodeList(account));
java里哪来的引用传递
楼上说的比较清楚了
你可以通过这个引用的副本去改变对象的属性值,但无法改变引用的值即引用指向的内存空间
而你改变引用副本的值只是改变了这个引用副本的指向 和 实参的那个引用没有关系
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;
所以这一块比较迷糊;
哦 , 哎 还是基础不全面啊 ,当年老实讲这一块的时候主要讲的是 String 的变化,后来就只有印象,具体怎么回事不清楚了 。我看了一下我之前的方法, 传进的list 是 用的 .add
把对象加里面去的,不是用 “=” 。
呵呵 谢谢各位了。