让我们假设有一个名为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)
为什么会发生这种情况?
答案 0 :(得分:2)
它甚至没有用应有的代码编写
是的,在这里:
Vector<Student> emptyVectorOfStudents = new Vector<Student>();
GroupOfStudents group1 = new GroupOfStudents(emptyVectorOfStudents);
GroupOfStudents group2 = new GroupOfStudents(emptyVectorOfStudents);
group1
和group2
均使用相同向量。如果希望它们具有单独的向量,请为它们提供单独的向量:
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(...)
。因此,我们必须与已有的东西一起工作。但是,嘿!如果一切都很容易,那将很无聊,不是吗? :)