2013-10-19 10 views
6

जब मैं के लिए लूप सामान्य उपयोग करते हैं,
एक सरणी में सभी तत्वों को सामान्य रूप से प्रारंभ हो जाएगा:लूप के लिए वर्धित तत्वों में सरणी तत्व क्यों प्रारंभ नहीं किए गए हैं?

Object[] objs = new Object[10]; 
for (int i=0;i<objs.length;i++) 
     objs[i] = new Object(); 


लेकिन जब मैं एक के लिए-प्रत्येक लूप का उपयोग करें।
सरणी तत्व, अभी भी null हैं पाश के बाद:

Object[] objs = new Object[10]; 
for (Object obj : objs) 
     obj = new Object(); 


मैंने सोचा था कि obj एक सरणी में एक विशेष तत्व को संदर्भित करता है,
तो अगर मैं इसे प्रारंभ, सरणी तत्व हो जाएगा साथ ही शुरू किया गया।
ऐसा क्यों नहीं हो रहा है?

उत्तर

10

मैंने सोचा कि ओबीजे एक सरणी, में किसी विशेष तत्व को संदर्भित करता है, इसलिए यदि मैं इसे प्रारंभ करता हूं, तो सरणी तत्व भी आरंभ किया जाएगा। ऐसा क्यों नहीं हो रहा है?

नहीं है, obj पाश के शरीर के शुरू में सरणी तत्व की मूल्य है। सरणी तत्व चर के लिए यह ऊर्फ नहीं है। तो इस तरह एक पाश (सरणियों के लिए, यह iterables के लिए अलग है):

for (Object obj : objs) { 
    // Code using obj here 
} 

के बराबर है:

for (int i = 0; i < objs.length; i++) { 
    Object obj = objs[i]; 
    // Code using obj here 
} 

पाश के लिए बढ़ाया का सही व्यवहार के अधिक जानकारी के लिए section 14.14.2 of the JLS देखें।

+0

धारा 14.14.2 मुझे इसके बारे में कुछ भी नहीं बताता है लेकिन आपका जवाब बहुत स्पष्ट है, धन्यवाद! –

+0

बस जांचने के लिए, क्या अभी भी 'objs [i]' पर विधियों का मतलब 'obj.method()' करके 'obj' के माध्यम से किया जा सकता है? चूंकि 'ओबीजे' 'ओब्जे' को इंगित कर रहा है [i] ' – SmRndGuy

+0

@ एसएमआरएनडीयूयू:" विधियों ... अभी भी किया जा सकता है "से आपका क्या मतलब है? आप अभी भी संदर्भ के माध्यम से विधियों को कॉल कर सकते हैं, लेकिन यह सरणी की सामग्री को नहीं बदलेगा। –

0

आप 'obj' के लिए नया मान निर्दिष्ट कर रहे हैं, न कि 'objs' के लिए, इसलिए तत्व शून्य हैं। तुम भी objs को मान देना है:

Object[] objs = new Object[10]; 
    for (int k = 0; k < objs.length; k++) { 
     objs[k] = new Object(); 
     System.out.println(objs[k]); 
    } 
1
Object[] objs = new Object[10]; 
for (Object obj : objs) 
    obj = new Object(); 

आप अंतरिक्ष जहां वस्तुओं जाना होगा बना लिया है, लेकिन आप वास्तव में वस्तुओं नहीं बनाई है। इस सरणी में वस्तुओं से अधिक पुनरावृति करने के लिए यदि वे मौजूद कोशिश करेंगे (जो वे अभी तक नहीं!)

Object[] objs = new Object[10]; 
for (int i=0; i < objs.length; i++) 
    objs[i] = new Object(); 

इस तथ्य यह है कि आप बस 9 0 से गिनती कर रहे हैं की वजह से अलग है, और उन्हें सरणी में उचित स्थान पर संग्रहीत करना।

+0

यदि मैं सही ढंग से समझता हूं तो आपका उत्तर वास्तव में जॉन स्कीट के उत्तर से मेल नहीं खाता है। –

+5

वह जॉन स्कीट है। मैं इसके साथ प्रतिस्पर्धा नहीं कर सकता। – yamafontes

0

आप सरणी तत्व (जो एक चर है जो किसी ऑब्जेक्ट का संदर्भ होगा) के लिए नई ऑब्जेक्ट असाइन कर रहे हैं जिसे लूप के बाहर एक्सेस किया जा सकता है।

Object[] objs = new Object[10]; 
for (int i=0;i<objs.length;i++) 
objs[i] = new Object(); 

लेकिन प्रत्येक पाश के लिए आप स्थानीय चर के लिए नई वस्तु बताए जाते हैं (सरणी तत्व नहीं)

Object[] objs = new Object[10]; 
for (Object obj : objs){ 
obj = new Object(); 
} 
//obj can not be accessed here 

और हम इस लाइन के बारे में बात करते हैं

 for (Object obj : objs){ 

फिर अपने इसका मतलब यह है कि आप ओबीजे तत्व का मूल्य स्थानीय परिवर्तनीय ओबीजे में ले रहे हैं, जो शून्य है।

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