2014-11-02 4 views
7

यदि हमें किसी ऑब्जेक्ट के लिए स्मृति आवंटित करने के लिए new ऑपरेटर की आवश्यकता है, तो हम स्मृति प्रकार आवंटित करने के लिए डेटा प्रकारों से पहले का उपयोग क्यों नहीं करते?जावा में, स्मृति प्रकार आवंटित करने के लिए डेटा प्रकार से पहले क्यों नया ऑपरेटर उपयोग नहीं किया जाता है?

class-name class-var = new class-name(); 
new int a; 
+0

यह कौन सी भाषा है? –

+2

क्या मेरा सवाल गलत है कि मुझे वोट दिया गया, मेरी प्रतिष्ठा 11 थी, अब यह 9 है, प्रतिष्ठा बनाना मुश्किल है, लेकिन ढीला आसान है। : डी – user2849331

+0

@ user2849331 नहीं, कुछ जोकर बिना किसी स्पष्टीकरण और कारण के इस धागे में सब कुछ टोलिंग और डाउन-वोटिंग कर रहे हैं। – SnakeDoc

उत्तर

3
  1. क्योंकि James Gosling ऐसा कहा .... (या Bjarne Stroustrup ऐसा कहा)। असल में, यह ज्यादातर भाषा डिजाइन का सवाल है, तकनीकी कानून नहीं।

  2. javac आपसे इन अर्थशास्त्र को छुपाता है और जिसे मुक्केबाजी/अनबॉक्सिंग कहा जाता है (और यह स्वचालित रूप से करता है)। वे प्रकार values या "ऑब्जेक्ट्स" के रूप में मौजूद हो सकते हैं (आमतौर पर एक ढेर के साथ लागू)। जब किसी संदर्भ को किसी ऑब्जेक्ट संदर्भ की आवश्यकता होती है, तो javac int मान को ऑब्जेक्ट रैपर (int -> Integer) में स्थानांतरित करने के लिए बॉक्स निर्देश को उत्सर्जित करता है और reference value पास करता है। कई निम्न स्तर के जेवीएम ऑपकोड स्केलर वैल्यू को संभालने के लिए बनाए जाते हैं क्योंकि कुछ संदर्भ मानों (या सिर्फ संदर्भ) को संभालने के लिए बनाए गए हैं।

एक प्रमुख उदाहरण संग्रह में int संग्रहीत कर रहा है। यह बॉक्सिंग हो जाता है।

लेकिन अंत में, पूछना कि एक भाषा जो वाक्य रचनात्मक रूप से करती है वह एक कलाकार से पूछने की तरह है कि उसने इस तरह एक चित्रकला क्यों पेंट की। सिर्फ इसलिए कि। भाषाएं कुछ हद तक भावनाओं और भावनाओं से डिजाइन की गई हैं, लेकिन जावा के मामले में, new का सिंटैक्स सी ++ से विरासत में मिला था, इसलिए हो सकता है कि व्हाइम Bjarne Stroustrup's हो सकता है। यह भी मान लें कि स्कैला भी एक जेवीएम भाषा है, फिर भी इसमें कुछ आम विचारों के लिए बहुत अलग वाक्यविन्यास है।

यहां कुंजी यह है कि संकलक लेखक कल निर्णय ले सकता है कि "नया जावा" एक नई भाषा होगी जिसके लिए सभी प्रकार के सामने सभी कैप्स में NEW की आवश्यकता होगी। इसे भाषा के अर्थशास्त्र को प्रभावित किए बिना लागू किया जा सकता है, जो भी हो।

माना जाता है कि विकल्पों के पीछे ध्वनि डिजाइन और स्थिरता है, लेकिन विकल्प अभी भी विकल्प हैं। इस मामले में, पसंद स्पष्ट रूप से इंगित करता है कि int एक आदिम प्रकार है, और new केवल वस्तुओं को लौटाता है, न कि प्राइमेटिव्स। तो यह वाक्यविन्यास का एक अच्छा विकल्प है।

+0

आज भी कठिन भीड़ ... – codenheim

+0

आपकी पीठ मिली; पी – SnakeDoc

+0

यह एक कारण हो सकता है कि स्मृति संकलन समय पर आदिम डेटा प्रकार को आवंटित किया गया है, जबकि नया ऑपरेटर रन टाइम पर आवंटित करता है। – user2849331

0

यह ज्यादातर इस कारण को पढ़ता है कि संकलक और/या दुभाषिया इस स्रोत को कैसे पढ़ेंगे। असल में आपको कंपाइलर/दुभाषिया को यह बताना होगा कि यह किस प्रकार की ऑब्जेक्ट मेमोरी असाइन करने से पहले काम कर रहा है। सी और जावा समेत अधिकांश भाषाओं में यह वही है। आप मूल रूप से कंपाइलर/दुभाषिया को ऑब्जेक्ट के प्रकार, उस ऑब्जेक्ट का नाम, फिर असाइनमेंट ऑपरेशन बताते हैं। new हमेशा असाइनमेंट ऑपरेटर के दाईं ओर नहीं है, जैसा कि आप एक ही ऑब्जेक्ट प्रकार के मौजूदा चर नाम/हैंडल को कॉपी/क्लोन कर सकते हैं।

जावा प्राइमेटिव्स को new ऑपरेटर की आवश्यकता नहीं है क्योंकि @pep ने कहा है, भाषा/मंच पहले से ही उस प्रकार के निर्धारित आकार को जानता है। int हमेशा जावा में 32 बाइट्स होंगे, लेकिन MyCustomClass नहीं हो सकता है।

+0

वाह, बिना किसी स्पष्टीकरण के बहुत सारे वोट ... – SnakeDoc

+1

हाहा - कोई मजाक नहीं। –

+0

ऐसा लगता है, आपके सभी वोट नीचे – mudasir

0

क्योंकि प्राचीन डेटा प्रकार पहले ही भाषा द्वारा परिभाषित किए गए हैं, और कीवर्ड द्वारा नामित हैं। आपको बस इतना करना है यह घोषणा है, और के लिए यह

2

जावा प्रकार के दो प्रकार है पहले से परिभाषित स्मृति आरक्षित हो जाएगा: संदर्भ डेटा प्रकार आदिम डेटा प्रकार और।

int एक आदिम डेटा प्रकार है। एक संदर्भ डेटा प्रकार किसी वर्ग का उदाहरण, या किसी सरणी का उदाहरण संदर्भित करता है।

आदिम डेटा प्रकारों के लिए, new ऑपरेटर का उपयोग नहीं किया जाता है। आदिम डेटा प्रकार हमेशा मूल्य द्वारा पारित किए जाते हैं। संदर्भ डेटा प्रकारों के लिए, संदर्भ मान द्वारा पारित किया जाता है, लेकिन आपके पास एक ही ऑब्जेक्ट या सरणी को इंगित करने वाले कई संदर्भ हो सकते हैं।

तो यदि आप उस वस्तु में कुछ भी बदलते हैं जो आपका संदर्भ इंगित करता है, तो अन्य सभी संदर्भों में परिवर्तन भी दिखाई देता है। आदिम डेटा प्रकारों के लिए, ऐसा नहीं होता है। आदिम और संदर्भ डेटा प्रकारों के बारे

अधिक जानकारी:

Chapter 4 of the Java Language Specification

+0

"आदिम डेटा प्रकार हमेशा मूल्य से पारित होते हैं।", ठीक है, जावा में सब कुछ ऑब्जेक्ट्स सहित मूल्य से गुजरता है। यह सिर्फ इतना है कि जब आप किसी ऑब्जेक्ट को किसी विधि में पास करते हैं, तो आप संदर्भ के मान को पार कर रहे हैं। ;) – SnakeDoc

+0

@ स्नैकडॉक जो गलत है। वस्तुओं को संदर्भ द्वारा पारित किया जाता है, वस्तुओं के संदर्भ मूल्य से पारित होते हैं। कृपया मेरा पूरा जवाब पढ़ें। –

+0

क्षमा करें, लेकिन जावा स्पष्ट रूप से केवल पास-दर-मूल्य है। आप संदर्भ के मान को पास करते हैं, लेकिन संदर्भ में स्वयं के रूप में संदर्भ नहीं है। इसमें एक अंतर है। मैं आपको संदर्भ देता हूं: http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – SnakeDoc

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

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