2009-03-08 21 views
8

अगर मैं इस जैसे एक सदस्य चर (एक वर्ग के शरीर में घोषित) इस सरणी के सभी सदस्यों के माध्यम सेजावा ऑब्जेक्ट संदर्भ/गुंजाइश सवाल

private Dot[] dots=new Dot[numDots]; 

मैं पाश, और है:

1) अन्य वर्ग के एक समारोह है, जो करने के लिए हर डॉट वस्तु दर्रा:

2) पासेस यह अभी तक एक 3 वर्ग का एक और समारोह, कुछ स्थितियों

3 पूरी हो गई हों करने के लिए) और 3 वर्ग कुछ prope में परिवर्तन डॉट ऑब्जेक्ट की rties

तब जब यह ऑब्जेक्ट मूल/मूल वर्ग में वापस आ जाता है, तो क्या उनके गुणों में परिवर्तनों को बनाए रखा जाएगा? या यह दूसरे चर के कार्यों द्वारा स्थानीय चर की तरह व्यवहार किया जाएगा?

+0

मुझे आपका नाम पसंद है और प्रश्न पढ़ने के बिना मतदान किया गया है। – Cheeso

उत्तर

12

हां, गुणों में परिवर्तन बनाए रखा गया है। जावा 100% पास-बाय-वैल्यू है, हालांकि, जब आप कोई ऑब्जेक्ट पास करते हैं, तो "मान" पास वास्तव में ऑब्जेक्ट का सूचक होता है। इस प्रकार, जब आप एक विधि में एक वस्तु बदलते हैं, तो वास्तविक वस्तु में पारित बदल रहे हैं

यही है, अगर आप निम्न विधि है, तो बुला विधि परिवर्तन देखेंगे:।

private void updateMyDot(final Dot aDot) { 
    aDot.dotColor = new Color(255,255,255); 
} 

लेकिन यदि आप निम्न कार्य करते हैं, तो कॉलिंग विधि नहीं परिवर्तन देखेंगे।

private void updateMyDot(/* not final */ Dot aDot) { 
    aDot = new Dot(); 
    aDot.dotColor = new Color(255,255,255); 
} 

दूसरे उदाहरण में, फोन करने वाले नहीं कोई भी परिवर्तन देखेंगे और नव निर्मित Dot वस्तु नहीं देख सकेंगे।

2

वस्तुओं [ संदर्भमूल्य जहां मूल्य संदर्भ है] (चीजें हैं जो वस्तु से विरासत), आदिम मूल्यों (पूर्णांक, लंबे, डबल, आदि) मूल्य से पारित कर रहे हैं द्वारा पारित कर रहे हैं।

इसका मतलब यह है कि जब एक आदिम पद्धति के लिए एक फोन करने वाले से पारित हो जाता है यह की नकल की है, जबकि एक वस्तु के साथ संदर्भ एक [ की मूल्य] पारित कर दिया है।

जो बदले में इसका अर्थ है कि जब किसी ऑब्जेक्ट को किसी विधि द्वारा उत्परिवर्तित किया जाता है तो कॉलर उन परिवर्तनों को देखता है क्योंकि इसका एक ही ऑब्जेक्ट का संदर्भ होता है।

इसके विपरीत जब एक विधि एक आदिम को बदलती है तो कॉलर में परिवर्तन दिखाई नहीं देता है क्योंकि विधि प्रतिलिपि पर काम कर रही है।

[संपादन के लिए कारण]

तो जावा संदर्भ द्वारा पारित किया था तो आप ऐसा कर सकते हैं:

Object x; 

x = new Integer(42); 
foo(x); 
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float 

जहां foo के रूप में परिभाषित किया गया है:

void foo(Object o) 
{ 
    o = new Float(43); 
} 

के बाद से जावा गुजरता मूल्य o = new Float(43); द्वारा संदर्भ की अनुमति है - लेकिन कॉलर में मान new Integer(42);

के रूप में रहेगा 210
+0

जैसा कि दस लाख अन्य स्थानों में बताया गया है, यह सख्ती से सच नहीं है। सभी पैरामीटर जावा में मान द्वारा पारित किए जाते हैं। हालांकि, ऑब्जेक्ट चर वास्तव में ऑब्जेक्ट संदर्भों का संदर्भ लेते हैं। ऑब्जेक्ट वैरिएबल के रूप में ऑब्जेक्ट को पास करने से ऑब्जेक्ट वैरिएबल की प्रतिलिपि होती है, यानी संदर्भ की प्रतिलिपि बनाते हैं। – mtruesdell

संबंधित मुद्दे