我试图给数组中的String变量赋值:
String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
public class Passenger {
private String firstNameField;
private String lastNameField;
private String firstName;
private String lastName;
public Passenger(String details) {
String[] temp = details.split(",");
String[] fields = {firstNameField, lastNameField, firstName, lastName};
for (int ctr = 0; ctr < fields.length; ctr++) {
fields[ctr] = temp[ctr];
}
// Print instance variables - all null
System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);
// Print array - has values
System.out.println(Arrays.toString(fields));
}
// Methods
}
但是,实例变量本身仍为null,而在遍历数组时
fields[]
具有值。为什么会这样以及如何实现呢?
最佳答案
字符串对象是不可变的-您无法更改其值-在执行赋值操作时,您正在更改变量(或给定数组索引中的变量)所引用的对象。
当您这样做时:
String[] fields = {firstNameField, lastNameField, firstName, lastName};
您可以将
fields
数组值的引用设置为index
0,将其设置为firstNameField
所引用的同一对象(在本例中为null
),将index
1设置为与lastNameField
引用相同的对象,等等。然后,如果您这样做:
fields[ctr] = temp[ctr];
您没有更改对象
fields[ctr]
的值之前引用的temp [ctr]值(您的实例变量之一),而是将fields[ctr]
设置为引用同一对象temp[ctr]
的引用权现在。如果要将变量称为数组,为什么不从一开始就将它们声明为数组?