public class School {
         //属性
String sname;
int jshu;
int jfshu;
//方法
public String toString()
{
      return "名称:"+this.sname+"教室数:"+this.jshu+"机房数:"+this.jfshu;
}


}public class Schooltest { /**
 * @param args
 */
public static void main(String[] args){
       
       School xiao2=new School();
       xiao2.sname="changsha";
       xiao2.jfshu=2;
       xiao2.jshu=3;
       
       System.out.println(xiao2.toString());
       
       School xiao3=new School();
       xiao3=xiao2;
    
       xiao3.sname="wuhan";
       System.out.println(xiao2.toString());
       System.out.println(xiao3.toString());
}}
上面是一段简单的代码,但是鄙人心里有个疑问,在 xiao3=xiao2之后,xiao3的值改变了,xiao2的值也改变了,xiao3的值改为wuhan,xiao2的值也改为wuhan了,大为不解,请各位给解释下。

解决方案 »

  1.   


      xiao3.sname="wuhan"; 
      

  2.   

    xiao3=xiao2; 
    xiao2的引用赋给xiao3后,两个引用指向相同的内存区。
      

  3.   


    class School { 
            //属性 
    String sname; 
    int jshu; 
    int jfshu; 
    //方法 
    public String toString() 

          return "名称:"+this.sname+"教室数:"+this.jshu+"机房数:"+this.jfshu; 

    } public class Schooltest { /** 
    * @param args 
    */ 
    public static void main(String[] args){ 
          
          School xiao2=new School(); 
          System.out.println(xiao2.hashCode());
          xiao2.sname="changsha"; 
          xiao2.jfshu=2; 
          xiao2.jshu=3; 
          School test=new School();
          System.out.println(test.hashCode());
          System.out.println(xiao2.toString()); 
          
          School xiao3=new School(); 
          xiao3=xiao2; 
          System.out.println(xiao3.hashCode());
          xiao3.sname="wuhan"; 
          System.out.println(xiao2.toString()); 
          System.out.println(xiao3.toString()); 
    } }把他们的hashCode打出来,就明白了.xiao2和xiao3是同一个
      

  4.   

    我用C++给你解释下:
    **************第一种情况************************************
    #include <iostream>
    #include <string>class school
    {
    public:
    std::string name;
    int jiaoshi,jifang;
    public:
    void tostring()
    {
    std::cout<<name<<jiaoshi<<jifang<<std::endl;
    }
    };
    int main(int argc,char *argv[])
    {
    school *xiao2=new school;
    xiao2->name="changsha";
    xiao2->jiaoshi=2;
    xiao2->jifang=3;
    std::cout<<xiao2->name<<std::endl;
    school *xiao3=new school;
    xiao3=xiao2;
    xiao3->name="wuhan";
    std::cout<<xiao2->name<<xiao3->name<<std::endl;
    }
    用堆分配对象时,用的是指针指向所分配的内存区域,这样就相当于将xiao2的指针值赋给xiao3,也就是xiao3指向的内存区域与xiao2指向的相同,因此,一改俱改。
    *************************************第2种情况***********************
    int main(int argc,char *argv[])
    {
    school xiao2;
    xiao2.name="changsha";
    xiao2.jiaoshi=2;
    xiao2.jifang=3;
    std::cout<<xiao2.name<<std::endl;
    school xiao3;
    xiao3=xiao2;
    xiao3.name="wuhan";
    std::cout<<xiao2.name<<xiao3.name<<std::endl;
    }
    用栈给对象分配内存,就不存在上述问题
      

  5.   

          xiao3=xiao2;
          System.out.println(xiao2.toString());
          System.out.println(xiao3.toString());  
          xiao3.sname="wuhan";
          System.out.println(xiao2.toString());
          System.out.println(xiao3.toString()); 这样看就更容易理解了;两个引用总是指向相同的内存区。
      

  6.   

    TO baiyu123:
    把他们的hashCode打出来,就明白了.xiao2和xiao3是同一个hashCode是怎么调出来的?小弟新手。
      

  7.   


    实例化一个对象:xiao2,在堆上分配一块空间
    再实例化第二个对象:xiao3,同样在堆上分配一块空间
    然后将xiao2赋给xiao3,因为类是引用类型,引用类型的赋值是地址的赋值,所以xiao3也会指向xiao2的地址,xiao2和xiao3引用同一块内存空间,so,修改任何一个对象的属性值,另外一个也都会改变
      

  8.   

    在 xiao3=xiao2之后,xiao3的值改变了,xiao2的值也改变了,xiao3的值改为wuhan,xiao2的值也改为wuhan了?
    不可能吧
      

  9.   

    也就是说School xiao2=new School();这句话是分配了一块内存,xiao2 只是对这块内存的一个引用?那上课的时候老师说这句话的意思是为xiao2分配各内存空间。。?
      

  10.   

    那我想在xiao3=xiao2之后 改变xiao3的值xiao2的值不改变,怎么办呢?
      

  11.   

    xiao3=xiao2之后,xiao3的值改变了,xiao2的值也改变了
    只看这段代码的话肯定不会变
      

  12.   


    public class School { 
            //属性  -----还属性? 你这个哪个是属性呀?
    String sname; 
    int jshu; 
    int jfshu; 
    //方法 
    public String toString() 

          return "名称:"+this.sname+"教室数:"+this.jshu+"机房数:"+this.jfshu; 


     ..................................
          
      

  13.   

    用拷贝,Java中好像有个拷贝函数的。
      

  14.   

    可是到目前为止,还是没有人给出确切的答案。为什么xiao2、xiao3是引用?c++里不是要用&符来指定吗?java里怎么解释?
      

  15.   

    转载的一个帖子^_^光从编程角度来说,在Java里面对象名是一个引用(感觉和指针有点区别),在C++里面就是个实体,所以要改动某个对象里面的东西,前面加个“&”成为引用是少不了的
    例如:void fillWithInteger(Object &a);
    最后说一下指针,同意二楼说法,害了一代人,功能上和引用很像,不过老是出一些诸如越界之类的问题,使用起来也老要在变量前面加一个“*”,实在用起来不爽(当然不排除某些高手仍旧把它用的出神入化) 
      

  16.   

    楼主,其实很多朋友给你非常详细的解释了,是你没有理解呀!!!基础不好噢.我来打比方吧,比如:你叫张三,在CSDN上面有一个人叫canminco,张三今年20岁,canminco今年23岁,有一天,CSDN上的这个人canminco说,"张三,我从此后不上CSDN了,canminco这个ID就给你用吧",于是,你在CSDN上的ID就是canminco了.过年了,你说canminco是21岁呢,还是24岁呢?当然是21岁嘛!因为张三就是canminco,canminco就是张三,是同一个人呀.你的问题:xiao3=xiao2; 之后,xiao3就xiao2,xiao2就是xiao3,在计算机的内存中,它俩是同一块内存,也就是说是同一个东西.就像"张三"或""canminco"是你的称呼一样,xiao2和xiao3也是称呼,他们的术语叫"引用".而你先前创建的xiao3=new...,就像那个永远不再上CSDN的那个人一样,你永远也联系不到他了.canminco给张三用掉了.不知这样讲你知不知道了
      

  17.   

    不过java里这个引用倒是很奇特,对象名前不用&符