下面的代码没有达到我的预期.执行此代码后,每个字符串都为null.
String[] currentState = new String[answer.length()]; for(String x : currentState) { x = "_"; }
下面的代码完成了我的期望.currentState中的每个字符串现在都是"_"
String[] currentState = new String[answer.length()]; for (int i = 0; i < currentState.length; i++) { currentState[i] = "_"; }
有人可以解释为什么第一个案例不起作用?
通过设计,对于每个变量'x'(在这种情况下)并不意味着分配.我很惊讶它甚至编译得很好.
String[] currentState = new String[answer.length()]; for (String x : currentState) { x = "_"; // x is not a reference to some element of currentState }
以下代码可能会显示您正在执行的操作.请注意,这不是枚举的工作原理,但它举例说明了为什么不能指定'x'.它是位于'i'的元素的副本.(编辑:请注意,元素是引用类型,因此它是该引用的副本,对该副本的赋值不会更新相同的内存位置,即位置"i"处的元素)
String[] currentState = new String[answer.length()]; for (int i = 0; i < answer.length(); i++) { String x = currentState[i]; x = "_"; }
原始代码:
String currentState = new String[answer.length()]; for(String x : currentState) { x = "_"; }
重写代码:
String currentState = new String[answer.length()]; for(int i = 0; i < currentState.length; i++) { String x; x = currentState[i]; x = "_"; }
我将如何编写代码:
String currentState = new String[answer.length()]; for(final String x : currentState) { x = "_"; // compiler error }
用错误重写代码:
String currentState = new String[answer.length()]; for(int i = 0; i < currentState.length; i++) { final String x; x = currentState[i]; x = "_"; // compiler error }
当你做这样的事情时,使变量最终成为亮点(这是一个常见的初学者错误).尝试将所有变量设为final(实例,类,参数,catch中的异常等等) - 只有在真正需要更改它们时才使它们成为非final.您应该会发现90%-95%的变量是最终变量(初学者在开始这样做时会结束20%-50%).