【问题标题】:Java changing value of final array elementJava改变最终数组元素的值
【发布时间】:2014-09-24 21:42:39
【问题描述】:

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

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)

【问题讨论】:

标签: java arrays


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Arrays 是可变对象,除非创建的大小为 0。因此,您可以更改数组的内容。final 仅允许您防止将引用更改为另一个数组对象。

    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。请参阅这里的 javadoc (unmodifibale list).

    您可以执行以下操作

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

    任何时候都可以通过调用listUnModifiable.toArray();获取数组

    【讨论】:

      【解决方案3】:

      final 应用于变量时,这仅意味着它一旦初始化就不能重新分配。这并不妨碍对象本身被修改。在这种情况下,您正在修改数组对象。所以这很好:

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

      但这是不允许的。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          • 1970-01-01
          • 2015-10-29
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多