Java改变了最终数组元素的值

时间:2014-09-24 21:42:40

标签: java arrays

我试图理解如果我将一个值重新分配给最终的数组元素会发生什么,这就是代码:

public class XYZ {
    private static final String[] ABC = {"Hello"};

    public static void main(String[] args){
        System.out.println(ABC[0]);

        ABC[0] = " World!!!";
        System.out.println(ABC[0]);

    }
}

ABC是最终数组,并且在第一个位置它最初有"Hello",但是当我将它重新分配给" World!!!"时,它应该超过先前的值,或者它应该给出重新分配到最终变量的编译错误。这个程序运行正常,这是输出:

run:
Hello
 World!!!
BUILD SUCCESSFUL (total time: 0 seconds)

4 个答案:

答案 0 :(得分:10)

final关键字并不意味着您无法更改对象的状态,而只是标记为final的引用将保持不变。例如,您将无法执行

之类的操作
final String[] ABC = {"Hello"};
ABC = new String[3]; // illegal
ABC = someOtherArray; // illegal;
ABC[0] = "World"; // legal

答案 1 :(得分:5)

final应用于变量时,这仅表示初始化后无法重新分配。这并不妨碍对象本身的修改。在这种情况下,您正在修改数组对象。所以这很好:

ABC[0] = " World!!!";

但这不会被允许。

ABC = new String[]{" World!!!"};

答案 2 :(得分:4)

除非创建大小为0,否则

Arrays是可变对象。因此,您可以更改数组的内容。final仅允许您阻止将引用更改为另一个数组Object。

final String[] ABC ={"Hello"};
ABC[0]="Hi" //legal as the ABC variable still points to the same array in the heap
ABC = new String[]{"King","Queen","Prince"}; // illegal,as it would refer to another heap Object

我建议你使用 Collections.unmodifiableList(list) 来创建一个不可变的List.See javadoc (unmodifibale list).

您可以执行以下操作

String[] ABC = {"Hello"};
List<String> listUnModifiable = Collections.unmodifiableList(java.util.Arrays.asList(ABC));

在任何时候,您都可以通过调用listUnModifiable.toArray();

来获取数组

答案 3 :(得分:1)

我的回答与其他人一样,“final”只会阻止变量指向新对象,它不会阻止对象本身更新其成员。

关于你的其他回复提到输出似乎附加了字符串,但事实并非如此,因为在分配之前有一个print语句,在赋值之后有一个。