मैं इस सरल varargs विधि है जो सूची में प्रत्येक आइटम बांटता है:वरर्ग विधि अपनी प्रतिलिपि के बजाय कॉलर की सरणी को संशोधित करती है?
import java.util.*;
class A {
static long f(long... xs) {
Arrays.sort(xs);
long y = 100000000;
for (int i = xs.length - 1; i >= 0; i--)
y /= xs[i];
return y;
}
static {
System.out.println(f(5,2,6,3,9,3,13,4,5));
long[] xs = new long[]{5,2,6,3,9,3,13,4,5};
System.out.println(Arrays.toString(xs));
System.out.println(f(xs));
System.out.println(Arrays.toString(xs));
}
}
मैं सरणी की एक प्रतिलिपि पारित करने के लिए उम्मीद थी यह, लेकिन जाहिरा तौर पर यह किसी भी तरह, सरणी मैं में पारित संशोधित है बजाय इसके खुद स्थानीय प्रतिलिपि:
$ javac A.java && java A
79
[5, 2, 6, 3, 9, 3, 13, 4, 5]
79
[2, 3, 3, 4, 5, 5, 6, 9, 13]
तो मैं इस साधारण परीक्षण कार्यक्रम ने लिखा है:
class B {
static void f(Object... os) {
System.out.println(os);
}
static {
Object os = new Object[]{1,2,3};
System.out.println(os);
f(os);
}
}
और यह मैं क्या उम्मीद करता है, यह वस्तु सरणी bef क्लोन अयस्क f
(इसलिए अलग वस्तु पहचानकर्ता) में इसे पारित:
$ javac B.java && java B
[Ljava.lang.Object;@1242719c
[Ljava.lang.Object;@4830c221
तो फिर A
फोन करने वाले का बजाय सरणी अपनी एक प्रतिलिपि को संशोधित करने में f
है?
जावा प्रतियां मान द्वारा संदर्भ। जब तक आप इसे स्पष्ट रूप से नहीं करते हैं, तब तक यह कभी भी कॉपी या क्लोन ऑब्जेक्ट्स और न ही तर्कों (या किसी अन्य स्थिति) के रूप में सरणी करता है। –