Java将对象添加到错误的向量中(它甚至没有用应有的代码编写)

时间:2019-06-09 19:30:15

标签: java oop

让我们假设有一个名为GroupOfStudents的类,它具有一个名为vectorOfStudents的属性。因此,该类如下所示:

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents = new Vector<Student>();   
    public GroupOfStudents(Vector<Student> vectorOfStudents) {
        this.vectorOfStudents = vectorOfStudents;
    }
}

好吧,简单,对吧?另外,我们有一个名为Student的班级,假设它只是将学生的姓名作为属性。

public class Student {
    public String name;
    public Student(String name) {
        this.name = name;
    }
}

现在,让我们创建两个没有任何学生的小组。

Vector<Student> emptyVectorOfStudents = new Vector<Student>();
GroupOfStudents group1 = new GroupOfStudents(emptyVectorOfStudents);    
GroupOfStudents group2 = new GroupOfStudents(emptyVectorOfStudents); 

当然,让我们给group1例如一个叫“ Luke”的学生。

Student student1 = new Student("Luke");
group1.vectorOfStudents.add(student1);

让第二组保持为空。由于某些原因,当我要输出两组学生的姓名时,group2的向量中也有student1

for(Student s: group1.vectorOfStudents) {
    System.out.print("Name: " + s.name + " ");
}
System.out.println("");
for(Student s: group2.vectorOfStudents) {
    System.out.print("Name: " + s.name + " ");
}

输出为:

Name: Luke
Name: Luke

应该是:

Name: Luke (because second group has no students)

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

  

它甚至没有用应有的代码编写

是的,在这里:

Vector<Student> emptyVectorOfStudents = new Vector<Student>();
GroupOfStudents group1 = new GroupOfStudents(emptyVectorOfStudents);    
GroupOfStudents group2 = new GroupOfStudents(emptyVectorOfStudents); 

group1group2均使用相同向量。如果希望它们具有单独的向量,请为它们提供单独的向量:

GroupOfStudents group1 = new GroupOfStudents(new Vector<Student>());    
GroupOfStudents group2 = new GroupOfStudents(new Vector<Student>()); 

请注意,您的GroupOfStudents代码正在创建一个已经在构造中的Vector,但随后将其丢弃以将其收到的代码用作构造函数参数:

public class GroupOfStudents{
    // Creates a new Vector when an instance is created
    public Vector<Student> vectorOfStudents = new Vector<Student>(); 
    public GroupOfStudents(Vector<Student> vectorOfStudents) {
        // Throws away the Vector created above and uses the one from the parameter instead
        this.vectorOfStudents = vectorOfStudents;
    }
}

大概最好是抛弃该参数,而根本不传入Vector:

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents = new Vector<Student>(); 
    public GroupOfStudents() {
    }
}

public class GroupOfStudents{
    public Vector<Student> vectorOfStudents; 
    public GroupOfStudents() {
        this.vectorOfStudents = new Vector<Student>();
    }
}

答案 1 :(得分:0)

首先,您确定要使用Vector吗? documentation of Vector itself指出:

  

如果不需要线程安全的实现,建议使用ArrayList代替Vector

第二,如果要将Collection传递给构造函数类,则可能需要先复制Collection,然后再将它们存储在本地字段中(例如,通过{{3} }。 Java API此处设计欠佳。并非所有Collection都定义一个复制构造函数Collections.copy(...)。因此,我们必须与已有的东西一起工作。但是,嘿!如果一切都很容易,那将很无聊,不是吗? :)