自动删除已删除对象的对象

时间:2016-03-05 17:01:51

标签: java oop arraylist instances

我正在与三个班级合作。 1)Category 2)MainCategory 3)SubCategory

  1. Category:负责创建/删除主要类别
  2. MainCategory:可以创建/删除子类别(并将它们嵌套在各自的主要类别下)
  3. SubCategory:设置/获取自己实例的名称
  4. 我遇到的问题是,当我删除一个主类别对象(使用.remove)时,其下的子类别保持不变并转移到下一个主类别。我真的希望它们被删除,以防他们的(父)类别被删除。我在本文末尾的主要方法中的注释中指出了问题。谢谢。

    ## Category(Class)##

    public class Category {
    private ArrayList<MainCategory> mainCat  = new ArrayList<MainCategory>();
    private String name;
    
    
    public void addMainCat (MainCategory name){
        mainCat.add(name);
    }
    
    
    public ArrayList<MainCategory> returnList() {
        return mainCat;
    }
    
    
    
    public void removeCat(int location){
        System.out.println("The Main Category " + mainCat.get(location).getName() + " has been deleted.");
        mainCat.remove(location);
    
    }
    
    public void removeCat(MainCategory name){
        mainCat.remove(name);
    }
    

    }

    ## MainCategory(Class)##

    public class MainCategory{
    private ArrayList<SubCategory> subCat  = new ArrayList<SubCategory>();
    private String name;
    
    
    public void addSubCat(SubCategory name){
        subCat.add(name);
    }
    
    public void removeSubCat(SubCategory name){
        subCat.remove(name);
    }
    
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public ArrayList<SubCategory> returnList(){
        return subCat;
    }
    

    }

    ## SubCategory(Class)##

    public class SubCategory{
    
    
    private String name;
    
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    

    }

    ## Main(方法)##

        public static void main(String[] args) {
    
        Category stats = new Category();
    
        MainCategory mc1 = new MainCategory();
        MainCategory mc2 = new MainCategory();
    
        SubCategory sc1 = new SubCategory();
        SubCategory sc2 = new SubCategory();
    
        stats.addMainCat(mc1);
        stats.addMainCat(mc2);
    
        mc1.setName("salary");
    
        mc1.addSubCat(sc1);
        mc1.addSubCat(sc2);
    
        sc1.setName("mean");
        sc2.setName("median");
    
        System.out.println(stats.returnList().get(0).getName());
        System.out.println(mc1.returnList().get(0).getName());
    
        stats.removeCat(mc1); // This one is OK.
    
        System.out.println(stats.returnList().get(0).getName()); // Returns null, GOOD!
        System.out.println(mc1.returnList().get(0).getName()); // Returns mean (it should return null because mc1 was deleted)
    
    
    }
    

3 个答案:

答案 0 :(得分:2)

你的代码没有做你/想要/做的事情,而是你/告诉它/它做什么。如果您没有删除类别mc1,则会从mc1删除stats引用的类别。

这意味着您在代码中创建了实例mc1stats

Category stats = new Category();
MainCategory mc1 = new MainCategory();

然后您已将mc1添加到stats

stats.addMainCat(mc1);

然后您从mc1删除stats引用:

stats.removeCat(mc1); // This one is OK.

确实:

mainCat.remove(location);

实际上从location列表中删除了引用mainCat

但是在main()中你还有mc1的引用,它仍在你的记忆中,你仍然可以操纵它。

因此,您实际上没有任何问题,mc1仍然是您在将其添加到stats之前实例化的对象,并且将一直保留到您通过执行{{1}删除对该实例的所有引用,然后在某些时候,由于垃圾收集器,它将完全被破坏。

然后,在mc1 = null;的最后两行中,您的评论是错误的:

main()

第一个实际返回System.out.println(stats.returnList().get(0).getName()); // Returns null, GOOD! System.out.println(mc1.returnList().get(0).getName()); // Returns mean (it should return null because mc1 was deleted) 的值,恰好是mc2,因为您没有为其指定名称。然后,第二个返回均值,因为它仍然是您在null函数中使用的mc1对象,无论您对main()做了什么。

  

我遇到的问题是,当我删除其中一个主类别对象(使用.remove)时,其下的子类别仍保留并转移到下一个主类别

所以在这里你弄错了。子类别不会转移到下一个类别,只要仍然引用stats,子类别将与类别实例一起保持实例化。一旦你取消引用它们(例如mc1),因为你将无法查看它们,它们也会从JVM的内存中消失。

你应该阅读更多关于java如何使用实例和对实例的引用的信息,不要再这么想了!

CF:

在线提供一些资源,以增强您对Java的了解!

HTH

答案 1 :(得分:1)

您仍然引用了mc1,因此无法将其删除。您调用在主类中创建的实例,因此您只删除了列表中的引用而不是Category类中的整个对象。

答案 2 :(得分:1)

您只从顶部列表中删除了主类别的引用,但主类别仍然是包含更多元素作为子列表的独立列表。你应该手动删除它们

mc1.returnList().clear();