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?"空":"非空"));
}
}
面向对象引用编程语言

解决方案 »

  1.   

    这个问题在于java语言传参数的机制
    先说下结果:aa:非空 , bb:空
    分析:方法pt的参数st在此方法内部可以作为对象ST的一个引用,只是在方法内运行有效,一旦执行结束就会消失。
    在本例中是将st作为参数传进去的,也就是说将st的副本传进去了,当在方法运行结束后,st的副本也就会消失。所以说对于外界的st变量还是指向null。但是在内部由于重新new了一次,是非空对象。
    lz翻阅下java编程思想,里面有专门的章节介绍这个问题
      

  2.   

    aa:非空
    bb:空
    我理解的是:在main里面实例化st=null;java虚拟机在执行时候将null赋值给st,当调用方法时候传参给这个方法,方法内部new ST(),虚拟机此时分配内存空间给st,此时的st非空,所以aa:非空。当方法执行之后,java虚拟机将内存释放掉,此时st还原成null,所以bb:空
      

  3.   

    http://bbs.csdn.net/topics/390428887
    这里有非常热烈的讨论,详细解答过程
      

  4.   

    aa:非空
    bb:非空值栈中的 st 在申明的时候指向 null;pt(st)之后,指向一个具体的 ST 对象,并输出 aa:非空.main方法继续执行, 发现 st 指向一个实例. 输出 bb:非空.