我在Java中创建一个简单的对象数组,我的代码的一部分是以下
public class Student{
private String name;
private double score;
public Student(String name){
this.name=name;
this.score=score
}
public class Classroom{
private Student[] listStu;
private int sc;
public addStu(Student stu){
listStu[sc]=stu;
sc++;
}
public Student[] getClassroom(){
return listStu;
}
public int getNum(){
return sc;
}
public printList(){
for (int i=0;i<sc;i++){
System.out.pritnln(listStu[i].getName());
}
}
在主课程中我编程:
Classroom c=new Classroom();
Student[] stuList;
int nStu;
Student s1=new Student("michael",3.0);
Student s2=new Student("larry",4.0);
c.addStu(s1);
c.addStu(s2);
stuList=c.getClassroom();
nStu=c.getNum();
问题是当我在主类中修改类stuList的对象时,类似于:
stuList[0].setName("peter");
我看到当我调用printList方法时,我的数组中的数据也被修改了(在我的例子中,“michael”的名称被“peter”更改)。我的问题是如何将我的对象数组复制到主类的stuList中,以便这个数组不会干扰我的原始数据?这个程序真的是必要的,还是不太可能发生这种情况?
由于
答案 0 :(得分:3)
通常你会使用List<Student>
而不是编写自己的集合,但问题是一样的。你有一个浅层的数组副本,你想要一个深层副本。您需要使用包含相同信息的新Student对象创建新数组,而不是引用该数组。
显然这是繁琐而缓慢的,一般建议是避免更改从集合中获取的任何集合(例如数组)。即使用setName是一个坏主意,除非“Michael”将他的名字改为“Peter”。如果你想用彼得取代迈克尔,你就有一个enw学生,那应该取代旧的学生参考。
答案 1 :(得分:1)
对Student
class:
class Student implements Cloneable {
protected Student clone() throws CloneNotSupportedException {
return (Student) super.clone();
}
在Classroom
class:
public Student[] deepCopy() throws CloneNotSupportedException {
Student[] deepCopy = new Student[this.listStu.length];
for (Student student : this.listStu) {
deepCopy[0] = student.clone();
}
return deepCopy;
}
然后使用main
方法:
Student[] backupList = c.deepCopy();
backupList[0].setName("test");
System.out.println(backupList[0].getName());
System.out.println(stuList[0].getName());
将输出:
test
michael
此外,您似乎在代码中遇到了一些语法错误:
public Student(String name){
this.name=name;
this.score=score
}
缺少右括号}
(方法中的那个),得分不是参数,缺少;
但是,如果您使用此解决方案,请务必记录更多有关cloning in Java
答案 2 :(得分:0)
在Java中,你使用指针,这就是为什么当你在第二个数组中修改它时,它也会在第一个数组内部进行修改。尝试更改此内容:
public addStu(Student stu){
listStu[sc]=stu;
sc++;
}
到此:
public addStu(Student stu){
listStu[sc]=(Student) stu.clone();
sc++;
}
看看它是否有效。
答案 3 :(得分:0)
要复制数组,请使用System.arraycopy(参见http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29)。
但请记住:Java中的一个对象数组是对数组元素的引用数组。与克隆集合类似,副本将包含相同的元素。对于您的用例,您必须复制元素本身。
答案 4 :(得分:0)
你可以这么做:
Student newStudent = stuList[0];
newStudent.setName("peter");
现在您有了一个新对象,如果更改它,数组值将不会受到影响。