我遇到了java类的一些问题。
这是我定义的课程
public class Condutor {
private String name;
public Condutor(){
name = "";
}
public Condutor(String aName){
this.name = aName;
}
public void setName(String aName){
name = aName;
}
public String getName(){
return name;
}
@Override
public String toString(){
return name;
}
}
在主要的我有这个
public static void main(String[] args) {
Condutor[] names = new Condutor[10];
Condutor name = new Condutor();
String aName = "";
for (int i = 0; i < 2; i++){
aName = "Mike" + i;
name = new Condutor(aName);
names[i] = name;
}
for (int i = 0; i < 10;i++){
System.out.println(names[i]);
}
}
这按预期工作打印: Mike0 Mike1 空值 空值 空值 空值 空值 空值 空值 空
维持同一课程但改变
name = new Condutor(aName);
names[i] = name;
通过
name.setName(aName);
names[i] = name;
System.out.println("------");
System.out.println(names[i]);
System.out.println("------");
打印
------
Mike0
------
------
Mike1
------
Mike1
Mike1
null
null
null
null
null
null
null
null
我可以看到在循环中一切都按预期工作但名称数组在前两个位置存储最后一个输入。
为什么会这样? 它不应该像在循环中那样存储吗?
的问候,
Favolas
答案 0 :(得分:3)
这是因为只创建了一个Condutor并在[0]和[1]位置添加了它。
对于i = 1,当您更改名称时,它会反映在[0]和[1]位置
答案 1 :(得分:1)
因为在第二步中你没有创建一个新的Condutor实例。您每次都使用相同的实例。
Condutor[] names = new Condutor[10];
Condutor name = new Condutor(); // this is the one that is being used.
答案 2 :(得分:1)
您还需要在第二种情况下创建新对象:
name = new Condutor(); //add this line to make sure you create new object in every iteration
name.setName(aName);
names[i] = name;
System.out.println("------");
System.out.println(names[i]);
System.out.println("------");
答案 3 :(得分:1)
在第一个版本中,您将在第一个循环的每次迭代中创建一个单独的实例。这样,每个“condutor”都会保留他的个人名字。
然而,在第二个版本中,您正在分配并因此在每次迭代中重复使用相同的Condutor实例(在main()的第2行中创建的实例),仅更改此一个对象的名称。因此,在打印结果时,您只能看到此单个对象的名称,最后如何设置。
答案 4 :(得分:0)
当你这样做时
names[i] = name;
你没有复制 name
下的对象,但你只是将引用复制到names[i]
。请注意,在更改之后,您永远不会创建除Conductor
第二行创建的main
之外的任何实例。另请注意,name
始终引用您在main
第二行中创建的同一实例。因此,当你做
name.setName(aName);
您反复设置同一对象的名称。您还将引用(而不是对象)复制到数组的第一个和第二个元素:
names[i] = name;
最终,只有一个Conductor
的名称已更新两次(在第一个循环中),其引用存储在name
中,{{1 }和names[0]
。这解释了输出。