回答你的問題:是的,有區別(見JavaDoc)。
您的第一個版本將一個對象實例放入行中的每個單個數組元素。因此,對該實例的更改在數組的同一行中的每個元素中都可見。您將總共有i
ClassB
個實例。
第二個版本將自己的實例放入每個數組元素中。您將總共有i*j
ClassB
個實例。
你的代碼的第一個版本就相當於
for (ClassB[] classB_1Array : classB_2Array) {
ClassB instance = new ClassB();
Arrays.fill(classB_1Array, instance);
}
希望這些信息可以幫助你,我沒看你的引擎收錄的代碼。
編輯:
澄清你的誤解,密切關注這個PROGRAMM的輸出:
import java.util.Arrays;
public class ArrayFiller {
public static void main(String[] args) {
// your first version:
Person[][] yourFirstVersion = new Person[2][2];
for (Person[] array : yourFirstVersion) {
Arrays.fill(array, new Person("Mike"));
}
System.out.println(Arrays.deepToString(yourFirstVersion));
yourFirstVersion[0][1].setName("Paul");
System.out.println(Arrays.deepToString(yourFirstVersion));
System.out.println("-----");
// equivalent: my version:
Person[][] myVersion = new Person[2][2];
for (Person[] array : myVersion) {
Person person = new Person("John");
Arrays.fill(array, person);
}
System.out.println(Arrays.deepToString(myVersion));
myVersion[0][1].setName("Thomas");
System.out.println(Arrays.deepToString(myVersion));
System.out.println("-----");
// your second version
Person[][] yourSecondVersion = new Person[2][2];
for (int i = 0; i < yourSecondVersion.length; i++) {
for (int j = 0; j < yourSecondVersion[i].length; j++) {
yourSecondVersion[i][j] = new Person("Max");
}
}
System.out.println(Arrays.deepToString(yourSecondVersion));
yourSecondVersion[0][1].setName("Chris");
System.out.println(Arrays.deepToString(yourSecondVersion));
}
private static class Person {
private String name;
public Person(String name) {
System.out.println("Constructor called for " + name);
this.name = name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
}
下面是輸出:
Constructor called for Mike
Constructor called for Mike
[[Mike, Mike], [Mike, Mike]]
[[Paul, Paul], [Mike, Mike]]
-----
Constructor called for John
Constructor called for John
[[John, John], [John, John]]
[[Thomas, Thomas], [John, John]]
-----
Constructor called for Max
Constructor called for Max
Constructor called for Max
Constructor called for Max
[[Max, Max], [Max, Max]]
[[Max, Chris], [Max, Max]]
非常感謝你對你的快速回答! 「將指定的對象引用分配給指定的對象數組的每個元素。」當然...「對象參考」。 我以爲我做了一個「新」對象,當指定新的時候: Arrays.fill(array,new Object); – Furlando
我未檢查答案,因爲我仍然想知道爲什麼Arrays.fill(array,new object())不起作用。我的意思是,我在那裏指定了一個新的關鍵字,所以它應該創建一個新的對象,不參考預先製作的東西。 – Furlando
看看我的答案中的代碼示例。 'new'被該方法調用一次,並且構造函數返回的引用就像我的代碼示例中一樣。主要的事實是:''new'只在你的第一個版本中被調用一次,就像我的代碼示例一樣。 – jlordo