我试图给数组中的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]的引用权现在。

如果要将变量称为数组,为什么不从一开始就将它们声明为数组?

10-06 16:14
查看更多