for(Catalogue catalogue : AppCatalogue.catalogues)
{
   catalogue.secondCatalogues.clear();    
}AppCatalogue.catalogues 是一个静态Vector<Catalogue>, 当我执行catalogue.secondCatalogues.clear();时发现AppCatalogue.catalogues下catalogue 的secondCatalogues也被clear了。然后我用一个容器Vector<Catalogue> all = new Vector<Catalogue>();执行all.addAll(AppCatalogue.catalogues) 最后将代码改为:
for(Catalogue catalogue : all)
{
   catalogue.secondCatalogues.clear();    
}结果还是清除了AppCatalogue.catalogues下catalogue 的secondCatalogues属性,求解是怎么回事?
如何才能不清除掉AppCatalogue.catalogues下的一切数据?

解决方案 »

  1.   

    怎么我看来看去你代码的意思本来就是想遍历清除AppCatalogue.catalogues下catalogue 的secondCatalogues
    这种情况,debug能帮你吧
      

  2.   


    我感觉楼主前后矛盾了第1处标红色字体的地方"catalogue.secondCatalogues.clear()"放在循环里 这句话的作用不就是clear容器中的所有secondCatalogues属性吗? 对象是引用传递我猜猜楼主的意图 楼主是想取出容器中每一个catalogue 赋值给一个Catalogue对象 这个对象可以.secondCatalogues.clear();操作 但不影响原容器中的每一个catalogues 
    如果是这样的话 楼主可以看看Object()中的clone()方法
      

  3.   

    [b]关于all.addAll(AppCatalogue.catalogues) 这个方法 它也是属于对象的引用传递 即all所指向的对象和AppCatalogue.catalogues所指向的对象的地址是一样的修改all中的对象 也就同时修改了AppCatalogue.catalogues中的对象
      

  4.   


    我感觉楼主前后矛盾了第1处标红色字体的地方"catalogue.secondCatalogues.clear()"放在循环里 这句话的作用不就是clear容器中的所有secondCatalogues属性吗? 对象是引用传递我猜猜楼主的意图 楼主是想取出容器中每一个catalogue 赋值给一个Catalogue对象 这个对象可以.secondCatalogues.clear();操作 但不影响原容器中的每一个catalogues 
    如果是这样的话 楼主可以看看Object()中的clone()方法
    谢谢我就是这个意思,不改变原容器的任何东西,因为我执行clear的时候同时也清除了原容器的secondCatalogues。  不过我复制一份数据all = (Vector<Catalogue>) AppCatalog.catalogues.clone();
    然后再: for(Catalogue catalogue : all)
    {
       catalogue.secondCatalogues.clear();    
    }
    还是和原来一样的效果,原AppCatalog.catalogues的secondCatalogues还是被清除了。
      

  5.   

    其实楼主可以这样子理解,你所谓的复制,只是把实参的地址传给了另外一个形参,意思就是,你复制得到的只是地址,而实际的参数值依然存放在heap中,所以你通过一个地址改变了实参的值,从另外一个地址访问得到的值也发生改变了。
      

  6.   

    简单的说,静态变量,不是LZ理解的那种放进去,就不会被清掉的。
    它只是告诉内存管理机制,老子不用它的时候,你也必须把它留着,老子告诉你清空的时候再清空。
    这可以避免过度的内存读写操作。要真的赋值的话,就必须老老实实的用赋值的方法。Clone()的方法,没有具体研究过,高人来说明下。
    我的理解是,Clone其实,只是在这种情况下,重新建立了AppCatalog.catalogues的所有地址。越土的方法,越有用,而且,更加稳定,速度更快。
    要让程序进化,就要使用各种算法,进行优化,提升速度。
    用的方法尽量老土化。