Java中的最终数组

Lio*_*ion 54 java

Java中的以下代码使用了一个final数组,String并且毫无疑问.

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它在控制台上显示以下输出.

I can never change
Run Code Online (Sandbox Code Playgroud)

以下代码也毫无疑问.

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    //CONSTANT_ARRAY={"I", "can", "never", "change"}; //Error - can not assign to final variable CONSTANT_ARRAY.
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,注释行会导致指定的错误,因为我们正在尝试重新分配声明final的类型数组String.


以下代码怎么样?

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    CONSTANT_ARRAY[2] = "always";  //Compiles fine.
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它显示I can always change意味着我们可以设法修改final类型数组的值String.我们能否以这种方式修改整个阵列而不违反规则final

Bri*_*ach 90

final在Java中影响变量,它与您分配给它的对象无关.

final String[] myArray = { "hi", "there" };
myArray = anotherArray; // Error, you can't do that. myArray is final
myArray[0] = "over";  // perfectly fine, final has nothing to do with it
Run Code Online (Sandbox Code Playgroud)

编辑以添加注释:请注意,我说的是您要分配给它的对象.在Java中,数组是一个对象.同样的事情适用于任何其他对象:

final List<String> myList = new ArrayList<String>():
myList = anotherList; // error, you can't do that
myList.add("Hi there!"); // perfectly fine. 
Run Code Online (Sandbox Code Playgroud)

  • 你说_object_,那很好.这适用于所有对象,而不仅仅是数组.修改最终变量值的对象也没关系.例如,`final List <String> list = new ArrayList <String>(); list.add( "富");`. (3认同)

She*_*zad 16

你错误地解释了最终的实现.final适用于数组对象引用,这意味着一旦启动它,引用就永远不会改变,但可以填充其自身的数组."它没有违反规则"你只指定了一个关于参考变化的规则,它正在相应地工作.如果你想要值也应该永远不会改变你应该去不可变列表即

List<String> items = Collections.unmodifiableList(Arrays.asList("I", "can", "never", "change"));
Run Code Online (Sandbox Code Playgroud)


小智 11

您只能这样做,因此无法更改数组引用.如果您希望无法更改元素,则需要使用某种类型的不可修改的集合.