2012-10-09 24 views
43

सवाल मूल रूप से आत्म-व्याख्यात्मक है। मैं सरणी के लिए एक एपीआई नहीं ढूंढ पाया (इस Arrays के अलावा, लेकिन यह वास्तविक सरणी से निपटने के लिए स्थिर सहायक कार्यों का एक गुच्छा परिभाषित करता है)। यदि इसके लिए कोई कक्षा नहीं है, तो ऐसा लगता है कि एक सरणी Object नहीं हो सकती है।एक सरणी एक आदिम प्रकार या एक वस्तु है (या पूरी तरह से कुछ और)?

हालांकि, इस तथ्य एक सरणी length तरह सार्वजनिक क्षेत्रों और तरीकों कि यह .equals() और .clone() तरह आह्वान कर सकते हैं है कि सुझाव देने के लिए (बहुत दृढ़ता से) पूरा विपरीत लगते हैं।

अजीब प्रस्तुति और आदिम सरणी के व्यवहार के लिए स्पष्टीकरण क्या है?

एक नोट के रूप में, मैंने अभी एक सरणी के .clone() विधि पर "ओपन इम्प्लीमेंटेशन" ग्रहण सुविधा का उपयोग करने की कोशिश की, उम्मीद है कि मैं यह देखने में सक्षम होगा कि यह तरीका कहां और कैसे परिभाषित किया गया था (क्योंकि यह int [] वस्तु से यह overrode), लेकिन यह वास्तव में अपने पूरे ग्रहण अप और दुर्घटना को फ्रीज करने का कारण बना ...

उत्तर

48

प्रत्येक सरणी प्रकार के लिए एक कक्षा है, इसलिए int[] के लिए एक कक्षा है, Foo[] के लिए एक कक्षा है। ये कक्षाएं जेवीएम द्वारा बनाई गई हैं। आप उन्हें int[].class, Foo[].class तक एक्सेस कर सकते हैं। इन कक्षाओं के प्रत्यक्ष सुपर वर्ग Object.class

public static void main(String[] args) 
{ 
    test(int[].class); 
    test(String[].class); 
} 

static void test(Class clazz) 
{ 
    System.out.println(clazz.getName()); 
    System.out.println(clazz.getSuperclass()); 
    for(Class face : clazz.getInterfaces()) 
     System.out.println(face); 
} 

वहाँ भी, एक संकलन समय subtyping नियम है कि अगर AB के उपप्रकार है, A[]B[] की उप-प्रकार है।

+0

उत्कृष्ट उत्तर है! मैं अब समझता हूं कि मुझे अब कोई एपीआई या कुछ भी नहीं मिला। यह बहुत दिलचस्प है कि जेवीएम इन वर्गों को रनटाइम पर बनाता है। एक आखिरी सवाल हालांकि: यदि कोई सरणी किसी अन्य वस्तु की तरह किसी वर्ग का सदस्य है, तो प्रारंभिक कार्य कैसे कार्य करता है? यदि आप जो कह रहे हैं वह सटीक है और [] कक्षा के नाम का हिस्सा है, तो उन्हें एक निर्माता का उपयोग क्यों नहीं किया जाता है, यानी नया int [] (2) बनाम नई int [2]? – asteri

+0

'int [2] 'वाक्यविन्यास सी से था, जिसे जावा ने करीब होने की कोशिश की। – irreputable

+0

यह सबसे अधिक संभावना है कि जेवीएम में विशेष कोड है जो सरणी प्रारंभिकता को संभालने के लिए है जो मानक ऑब्जेक्ट इंस्टेंटेशन से काफी अलग है। – Matt

2

एक सरणी है एक कंटेनर उद्देश्य यह है कि रखती है एक प्रकार के मूल्यों की एक निश्चित संख्या।

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

+0

मैंने उस दस्तावेज को देखा है, लेकिन इसके लिए एपीआई कहां है? यही वह है जिसे मैं कहीं भी नहीं ढूंढ सकता। – asteri

5

तो छोटे और सरल देखें, हाँ < प्रकार > [] Object का एक प्रकार है। यह Object से सीधे विस्तार करता है क्योंकि मैं इसे समझता हूं। इस पर सभी ऑब्जेक्ट विधियां हैं, toString(), hashCode(), ... प्लस एक विशेष खुलासा चर length कहा जाता है। कक्षा java.util.Arrays Arrays के प्रकार से निपटने के लिए एक उपयोगिता वर्ग है। जब आप गड़बड़ी में जोड़ते हैं तो यह थोड़ा उलझन में है: int[]Object[] से प्राप्त नहीं होता है। इसके अलावा, अन्य Object प्रकारों के विपरीत, सरणी प्रकारों के लिए कोई कन्स्ट्रक्टर नहीं हैं। वे new कीवर्ड का सम्मान करते हैं लेकिन आमतौर पर आकार के लिए आवंटित किया जाता है। यह थोड़ा विचित्र है, लेकिन उन भाषा quirks में से एक है।

हालांकि सवाल का जवाब देने के लिए, हाँ वे एक वस्तु हैं।

+0

एक सरणी एक वस्तु है ... लेकिन int [] ऑब्जेक्ट से प्राप्त नहीं है? यह मुझे भ्रमित करता है। और मैं एक निर्माता की अनुपस्थिति से भी उलझन में हूं, क्योंकि हम 'नया' उपयोग करते हैं ... यह कैसे काम करता है? एक मूलभूत सरणी मूल रूप से एक वस्तु और एक हार्डवार्ड आदिम के बीच एक क्रॉस है ...? – asteri

+1

कोई int [] ऑब्जेक्ट से प्राप्त नहीं होता है []।Int [] और ऑब्जेक्ट [], स्ट्रिंग [] ... की तरह सभी अलग हैं क्योंकि वे सभी ऑब्जेक्ट से प्राप्त होते हैं, ऑब्जेक्ट नहीं []। जेनिक्स एरे लेने वाले तरीकों को लिखते समय मदद करते हैं, साथ ही साथ एरेज़ यूटिलिटी क्लास का उल्लेख करते हैं, लेकिन हाँ यह अजीब क्विर्क कभी-कभी –

+0

को लाइन करने के लिए टाइप करने के लिए कुछ फंकी कोड की ओर जाता है यदि int [] ऑब्जेक्ट से प्राप्त नहीं होता है और int [] एक आदिम नहीं है, यह क्या है? क्या जावा का मुख्य अधिकतम है (कि सभी ऑब्जेक्ट्स 'ऑब्जेक्ट' का विस्तार करते हैं) पूरी तरह से सच नहीं हैं, और ऑब्जेक्ट्स की एक अलग श्रेणी है जो सरणी नीचे आती है? – asteri

13

नीचे दिए गए कोड को देखें। यह कम्पाइल: -

int[] arr = new int[2]; 
    System.out.println(arr.toString()); 

अब, किसी भी आदिम प्रकार पर, आप एक विधि (toString()) वस्तु वर्ग (या, उस बात के लिए किसी भी विधि) में परिभाषित फोन नहीं कर सकते .. तो, एक सरणी अनिवार्य रूप से एक Object है। ।

ठीक है, यहाँ तुम जाओ: -

JLS Section 4.3 से: -

के चार प्रकार के होते हैं संदर्भ प्रकार: वर्ग प्रकार (§8), इंटरफ़ेस प्रकार (§9), प्रकार चर (§4.4), और सरणी प्रकार (§10) टाइप करें।

और, Section 10: -

जावा प्रोग्रामिंग भाषा में, सरणियों वस्तुओं (§4.3.1), डायनामिक रूप से तैयार कर रहे हैं, और प्रकार वस्तु की चर (§ को सौंपा जा सकता है 4.3.2)। कक्षा ऑब्जेक्ट के सभी तरीकों को एक सरणी पर बुलाया जा सकता है।

तो, पहले बोली से, Array नहीं वास्तव में एक वर्ग .. है यह एक और प्रकार है .. लेकिन, अनिवार्य रूप से सरणियों हालांकि कुछ Class का नहीं, वस्तुओं रहे हैं, लेकिन वे Array प्रकार के होते हैं .. तो वे कुछ वर्ग के उदाहरण नहीं हैं, और हो सकता है array की वस्तुओं कि जिस तरह से बनाया जाना परिभाषित कर रहे हैं ..

+0

मुझे पता है। मैंने पहले सरणी का उपयोग किया है। वास्तविक, नियमित वस्तुओं की तुलना में सरणी अलग-अलग तरीके से व्यवहार करते समय यह प्रश्न तब सामने आया जब यह पता चला। उदाहरण के लिए, अपनी "नई" घोषणा में, आप 'नई int [2]() 'का उपयोग नहीं करते हैं ... क्योंकि यह वास्तविक निर्माता नहीं है। क्यूं कर? एपीआई कहां है? स्पष्टीकरण क्या है? यह आपके द्वारा कम से कम सरल है। – asteri

+1

और मुझे यह जानना अच्छा लगेगा कि किसी को मेरा जवाब पसंद नहीं है, ताकि मैं इसे डाउनवॉट्स देखने के बजाए इसे बेहतर बना सकूं .. –

+0

@Jeff .. मैंने इसे और अधिक समझदार बनाने के लिए अपनी पोस्ट संपादित की है .. आप एक नज़र देख सकते हैं .. –

25

Java Language Specification आप यह अनुमान लगा देना चाहिए:

एक सरणी प्रकार के प्रत्यक्ष सुपर क्लास वस्तु है।

प्रत्येक सरणी प्रकार इंटरफेस Cloneable और java.io.Serializable लागू करता है।

Moreover:

एक वस्तु एक वर्ग उदाहरण या किसी सरणी है।

तो सरणी उदाहरण नहीं हैं और इसलिए आपको उन्हें बनाने के लिए एक निर्माता की आवश्यकता नहीं है। इसके बजाय आप Array Creation Expressions का उपयोग करें।

+0

शायद मैं इस पर विचार कर रहा हूं ... लेकिन कुछ ऐसा वर्ग जो वर्ग या वर्ग का सदस्य नहीं है, फिर भी 'ऑब्जेक्ट' बढ़ा सकता है? – asteri

+1

@ जेफ मैं वास्तव में इसका जवाब नहीं दे सकता। शायद [यह] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.7) मदद करता है। इसके अलावा, यहां एक दिलचस्प जवाब है [यहां] (http://stackoverflow.com/questions/2267790/how-are-arrays-implemented-in-java)। – Baz

+0

@ जेफ 'int [] 'एक वर्ग – irreputable

0

जावा में केवल उन कई प्राचीन प्रकारों को जिन्हें हम जानते हैं। असल में, हमारे पास अभी भी एक सरणी बनाने के लिए कई कदम हैं, जैसे घोषणा, या प्रारंभ होने पर प्रारंभ करें, और इसका मतलब है कि सरणी वास्तव में एक वस्तु है।

गहराई से कदम, आदिम प्रकार मूल मानों के साथ स्मृति में संग्रहीत किया जा सकता है लेकिन वस्तु एक पता (संदर्भ) है। तो हम एक विरोधाभास की कल्पना कर सकते हैं, अगर सरणी एक आदिम प्रकार है तो हम स्मृति में मूल मानों को कैसे संग्रहीत कर सकते हैं? मुझे लगता है कि स्ट्रिंग के समान ही है, लेकिन स्ट्रिंग एक अंतिम ऑब्जेक्ट है ताकि आप किसी ऑब्जेक्ट को एक आसान तरीके से बना सकें, स्ट्रिंग एस = "एस", एक आदिम प्रकार की तरह।

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