我正在与三个班级合作。 1)Category
2)MainCategory
3)SubCategory
Category
:负责创建/删除主要类别MainCategory
:可以创建/删除子类别(并将它们嵌套在各自的主要类别下)SubCategory
:设置/获取自己实例的名称我遇到的问题是,当我删除一个主类别对象(使用.remove)时,其下的子类别保持不变并转移到下一个主类别。我真的希望它们被删除,以防他们的(父)类别被删除。我在本文末尾的主要方法中的注释中指出了问题。谢谢。
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);
}
}
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;
}
}
public class SubCategory{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
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)
}
答案 0 :(得分:2)
你的代码没有做你/想要/做的事情,而是你/告诉它/它做什么。如果您没有删除类别mc1
,则会从mc1
删除stats
引用的类别。
这意味着您在代码中创建了实例mc1
和stats
:
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();