Class TableEntity{
   private Vector menu;   public void setMenu(Vector menu){ this.menu=menu;}
   public Vector getMenu(){ return menu;}

MenuEntity是自己写的一个类
......
Vector o=new Vector();
MenuEntity x1=new MenuEntity();
MenuEntity x2=new MenuEntity();
MenuEntity x3=new MenuEntity();
o.addElement(x1);
o.addElement(x2);
o.addElement(x3);
TableEntity tt=new TableEntity();
tt.setMenu(o);
o.removeAllElements();
System.out.println(o.size());
Vector xs=tt.getMenu();
System.out.println(xs.size());.....
这样输出的是0,0
如果把o.removeAllElements()改成o=new Vector()的话输出是0,3
为什么会出现这种情况,removeAllElements为什么会把已经set进其他类的menu的也清0了,实在是想不明白

解决方案 »

  1.   

    set进其他类了,o仍然指向原来vector的引用。
      

  2.   

    顶楼上。
    其实JAVA跟C也一样的,对于对象来说,都有一个句柄的,楼主的代码中 o就是Vector对象的一个句柄,当你把它Set到了TableEntity类中,等于将这个对象又找了一个句柄,这两个句柄指向的是同一个东西,当你修改了对象中的内容时,两个句柄显示出来的东西当然是一样的。
      

  3.   

    vector存储的数据是镜像引用,this.menu=menu只是让this.menu的指针指向存储输入参数的那个vector的内存地址,实际这两个menu指向的是一个存储地址,所以无论通过那一个进行操作,都会影响到另一个;
    而通过o=new Vector()来新生成一个vector的话,就相当于分别存储了两个独立的数据,内存地址也不一样,所以可以分别控制
      

  4.   

    执行tt.setMenu(o); 这句话之后,对象o和tt里的属性menu同时指向生成的Vector对象,o.removeAllElements()语句将对象清空,而指向同一对象的memu(即tt.getMenu()返回的指向Vector对象的句柄)当然也就清空了,而o= new Vector()语句只会将o指向新生成的Vector对象,而tt.getMenu()返回的引用menu仍然指向原装有三个MenuEntity实例的对象,打印出来的当然也就是3了...