我试图理解如果我将一个值重新分配给最终的数组元素会发生什么,这就是代码:
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)
答案 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)
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语句,在赋值之后有一个。