public abstract class wren
{
public static void main(String[] args)
{
String st1, st2;
st1 = "2";
st2 = st1;
st1 = null;   //执行这行之后,为什么st2不是null呢??
System.out.print(st1);
System.out.print(st2);
}
}结果为:null2
st2=st1的时候,是不是st2和st1都指向一个内存空间呢,那为什么st1=null,的时候,st2不是null呢。

解决方案 »

  1.   

    st2=st1这一句其实是把引用st2指向了st1所指的对象,即内容为"2"的String类的对象,所以当st1这个引用的指向改变后,st2的指向不变,即仍然为字符串"2".
      

  2.   

    因为str1和str2都是对象的引用,不是对象本身,Java的对象都是在堆上创建的,操作时候用的都是引用的方式
      

  3.   

    Java的对象都是在堆上创建的,操作时候用的都是引用的方式.可以再深入一些么??不太明白
      

  4.   

    堆内存主要存对象,栈内存存引用
    比如:人--存在堆中
    楼主是个引用(就是个代号),因为你也是人~~,是一个特定的人
    人 楼主=new 人();
    右边在堆中开辟空间,这个对象包含人的属性,左边声明引用
    以后就可以直接用这个代号
    楼主.方法()来调用"人"中的方法
      

  5.   


    public abstract class wren { 
    public static void main(String[] args) { 
    String st1, st2; 
    st1 = "2"; 
    st2 = st1;    //st2指向st1的内存地址,得到值str="2"
    st1 = null;   //执行这行之后,st1被重新赋值
    System.out.print(st1); 
    System.out.print(st2); 

      

  6.   

    st1 是一个引用,"2"是一个实例
    st1 = "2";  //st1指向"2"
    st2 是一个引用 
    st2 = st1;//这句执行完 st2也指向"2" 也就是st1和st2同时指向"2"
    st1 = null;//执行完 st1 和 "2" 断开,st1不指向任何实例
    所以 st1为空 st2指向"2"
      

  7.   

    堆内存主要存对象,栈内存存引用。st1和st2为引用,当 st2 = st1时他们同指向一个对象“2”,当st1 = null时,st1指向空对象,st2则还指向栈内存中存储的“2”对象。st1改变的只是自己的引用地址,其原指向的对象并没有改变。