import java.util.HashSet;
public class java01 { /**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ST st=null;
pt(st);
System.out.println("bb:"+(st==null?"空":"非空"));
} public static void pt(ST st){
st=new ST();
System.out.println("aa:"+(st==null?"空":"非空"));
}
}
面向对象栈堆引用编程语言
public class java01 { /**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ST st=null;
pt(st);
System.out.println("bb:"+(st==null?"空":"非空"));
} public static void pt(ST st){
st=new ST();
System.out.println("aa:"+(st==null?"空":"非空"));
}
}
面向对象栈堆引用编程语言
解决方案 »
- ssh整合spring获取hibernate的session进行特殊查询
- 菜鸟提问,jsp连接sql server 2005报无法打开登录所请求的数据库
- ExtJs怎样使用?
- MLDN j2ee框架视频教程另加项目"我的智囊团"[历史最低价]9元支付宝交易
- 关于 Struts2 中的 s:optiontransferselect 标签使用。
- c3p0一个奇怪的问题
- 请问有关struts中标签的问题?
- java hibernate有中间表的一对多关系怎么配置XML呢
- SSH AOP事务配置求解
- zookeeper+dubbo+spring远程服务调用时报下边的错,感觉像是jar包的问题,但就是找不到,求大神帮看
- pb调用webservice 报错
- JSP页面 缺少对象
先说下结果:aa:非空 , bb:空
分析:方法pt的参数st在此方法内部可以作为对象ST的一个引用,只是在方法内运行有效,一旦执行结束就会消失。
在本例中是将st作为参数传进去的,也就是说将st的副本传进去了,当在方法运行结束后,st的副本也就会消失。所以说对于外界的st变量还是指向null。但是在内部由于重新new了一次,是非空对象。
lz翻阅下java编程思想,里面有专门的章节介绍这个问题
bb:空
我理解的是:在main里面实例化st=null;java虚拟机在执行时候将null赋值给st,当调用方法时候传参给这个方法,方法内部new ST(),虚拟机此时分配内存空间给st,此时的st非空,所以aa:非空。当方法执行之后,java虚拟机将内存释放掉,此时st还原成null,所以bb:空
这里有非常热烈的讨论,详细解答过程
bb:非空值栈中的 st 在申明的时候指向 null;pt(st)之后,指向一个具体的 ST 对象,并输出 aa:非空.main方法继续执行, 发现 st 指向一个实例. 输出 bb:非空.