2012-01-06 9 views
8

जावा में new कीवर्ड का उपयोग करना आवश्यक है। मैं जानता हूँ कि जब आप इस तरह एक वस्तु का एक उदाहरण बनाने यदि आप इसका इस्तेमाल करने वाले हैं:'नया' कीवर्ड का उपयोग करने के लिए उचित समय कब है?

TextView textView = new TextView(this); 

कोड में कभी-कभी मुझे लगता है कि new इस्तेमाल नहीं किया है और मैं भ्रमित हो .. कोड की इस पंक्ति में:

AssetManager assetManager = getAssets(); 

क्यों AssetManager का एक उदाहरण इस तरह का निर्माण नहीं किया जाता है:

AssetManager assetManager = new AssetManager(); 

तो यह getAssests के बराबर सेट किया गया है()?

new कब उपयोग किया जाना चाहिए?

धन्यवाद!

उत्तर

9

जब आप किसी ऑब्जेक्ट को पहली बार स्पष्ट रूप से बनाए जाते हैं तो आप नए कीवर्ड का उपयोग करते हैं। फिर गेटटर विधि का उपयोग करके ऑब्जेक्ट लाने के लिए नया आवश्यक नहीं है क्योंकि ऑब्जेक्ट पहले से ही स्मृति में मौजूद है, इस प्रकार इसे पुनर्निर्मित करने की आवश्यकता नहीं है।

आप नए यात्रा the oracle docs

एक वस्तु 'नए' कीवर्ड की आवश्यकता होगी, तो यह शून्य (जो कल्पना है आरंभ नहीं के लिए) है की एक अधिक विस्तृत विवरण चाहते हैं।

संपादित करें:

यह हमेशा प्रिंट होगा "की जरूरत है नई 'वर्तमान परिस्थितियों में।

Object mObj = new Object(); 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 
OUTPUTS: does NOT need new 

और उन परिस्थितियों हम हमेशा देखेंगे "नए की जरूरत नहीं है"

+0

आप कैसे जानते हैं कि कोई ऑब्जेक्ट पहले से ही बनाया गया है? – foobar5512

+0

जब आप इसे संदर्भित करने का प्रयास करते हैं, तो यह शून्य होगा। आप इसे किसी चीज़ से देख सकते हैं (मेरे अपडेट का संदर्भ लें) – AedonEtLIRA

+1

आपको यह जानकारी प्रलेखन - या अनुभव से प्राप्त होती है। उदाहरण के लिए प्रबंधक अक्सर सिंगलेट्स (या इसी तरह के समान) के रूप में उपयोग किए जाते हैं, इसलिए केवल एक उदाहरण है। इस प्रकार की कक्षाएं आप नहीं बनाते हैं, लेकिन ऑब्जेक्ट को पुनर्प्राप्त करने के लिए एक फ़ंक्शन है। –

2

तहत new का उपयोग कर आप के लिए स्मृति को आबंटित:

Object mObj = null; 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 

OUTPUTS: needs new 

तो यह तय करने के लिए, आप की तरह कुछ करना होगा उदेश्य।

getXXX() का उपयोग करके मौजूदा ऑब्जेक्ट को पहले से आवंटित करने के लिए उपयोग किया जाता है।

2

जब आप किसी फ़ंक्शन के लिए कन्स्ट्रक्टर को कॉल करते हैं तो नया उपयोग किया जाता है। getAssets() एक एसेट मैनेजर लौटाता है, इसे एक नया निर्माण करने की आवश्यकता नहीं है।

2

चूंकि आपने इसे [एंड्रॉइड] के साथ फ़्लैग किया है, इसलिए मुझे लगता है कि आपका कोड Activity या Service के अंदर है। इस मामले में, getAssets() आपके द्वारा विस्तारित कक्षा का एक तरीका है। तो आप वास्तव में इसे नहीं बना रहे हैं, आप मौजूदा कोड से पूछ रहे हैं कि आपको पहले से मौजूद क्या है इसका संदर्भ दें।

0

टेक्स्टव्यू में पूंजी पत्र और getAssets में इसकी कमी का ध्यान दें। getAssets TextView जैसी कक्षा नहीं है, यह एक ऑब्जेक्ट लौटने का एक तरीका है। और कई अन्य लोगों की तरह, आपकी संपत्ति पहले से मौजूद है।

5

जावा में आपको वस्तुओं को तुरंत चालू करने के लिए हमेशा new का उपयोग करना होगा (ठीक है, लगभग हमेशा)। getAssests() के साथ आप पहले से ही बनाए गए एक को पुनः प्राप्त कर सकते हैं।मुझे लगता है कि आपका प्रश्न सी ++ से आता है जहां new गतिशील स्मृति आवंटित करता है, लेकिन चूंकि जावा में केवल गतिशील वस्तुएं हैं, इसलिए हमेशा की आवश्यकता होती है।

3

new हमेशा नई वस्तु बनाने के लिए उपयोग किया जाता है।

इस

AssetManager assetManager = getAssets(); 

सिर्फ संदर्भ के लिए assetManager विधि getAssets() से लौटे एक मूल्य नियुक्ति कर रहा है।

[संपादित करें]

मैं new बारे में झूठ बोला यह कुछ इस तरह करने के लिए संभव है:

Foo.class.newInstance(); 

और प्रतिबिंब भी आप उपयोग कर सकते हैं:

Foo.class.getDeclaredConstructors(Class[] parameterTypes).newInstance(arguments); 
1

जावा में, new MyClass()creates a new instanceMyClass का और इसके लिए एक संदर्भ देता है।

इस बीच, घोषणा:

MyClass foo; 

एक चर foo कि MyClass का एक उदाहरण, या विशेष मूल्य null कि इस तरह के एक संदर्भ के अभाव इंगित करता है के लिए एक संदर्भ स्टोर कर सकते हैं परिभाषित करता है। यदि आप foo पर कोई संदर्भ नहीं दे रहे हैं, तो इसका डिफ़ॉल्ट मान null होगा।

आप निश्चित रूप से इन चीजों को जोड़ सकते हैं, उदा। इस तरह:

MyClass foo;   // define a variable foo that can store an object reference 
foo = new MyClass(); // create a new object and assign a reference to it to foo 

या, समतुल्य रूप, इस तरह:

MyClass foo = new MyClass(); // combined variable definition and assignment 

लेकिन अगर आप एक नया उदाहरण हर बार जब आप एक संदर्भ चर के लिए कुछ आवंटित बनाने के लिए नहीं है। आप बस ऐसा भी कर सकते हैं उदा। इस:

MyClass foo, bar;  // define two reference variables, foo and bar 
foo = new MyClass(); // create a new object and assign a reference to it to foo 
bar = foo;    // now foo and bar point to the same object 

या यहाँ तक कि:

MyClass foo = new MyClass(), bar = foo; // same, but shorter 

नोट है कि जावा में, के रूप में सी ++ जैसे कुछ अन्य भाषाओं के लिए विरोध किया, तो आप आवंटित नहीं कर सकते हैं (की एक प्रति) एक चर में एक वास्तविक वस्तु। इसके बजाय, जावा ऑब्जेक्ट्स हमेशा उनके संदर्भों के माध्यम से उपयोग किए जाते हैं। जब कोई जावा में किसी ऑब्जेक्ट को "ऑब्जेक्ट को असाइन करना" या "ऑब्जेक्ट को पैरामीटर के रूप में पास करना" या "किसी ऑब्जेक्ट से ऑब्जेक्ट को वापस करने" के बारे में बोलता है, तो वे हमेशा वास्तव में क्या मतलब रखते हैं कि संदर्भ को असाइन करना या पास करना या वापस करना है वस्तु।


आपके कोड कॉल (और अक्सर करते हैं) के तरीके भी ऑब्जेक्ट्स के संदर्भ वापस कर सकते हैं।

private MyClass getSomeObject() { 
    // ...some code here... 
} 

आप इसे कहते हैं और इस तरह एक चर में संदर्भ यह रिटर्न बचत हो सकती है:

MyClass foo; 
foo = getSomeObject(); 

या इस तरह:

MyClass foo = getSomeObject(); 
उदाहरण के लिए, यदि आपका वर्ग इस तरह की एक विधि था

हम विधि घोषणा से बता सकते हैं कि getSomeObject() हमेशा MyClass उदाहरण (या null) का संदर्भ वापस कर देगा, लेकिन जहां नहीं उदाहरण में वास्तव में आता है। यह पूरी तरह से निर्भर करता है कि getSomeObject() विधि के अंदर कोड क्या करता है। कोड हर बार new MyClass() के साथ के साथ एक नया MyClass उदाहरण बना सकता है, और इसके संदर्भ में वापस आ सकता है, या यह हमेशा उसी ऑब्जेक्ट का संदर्भ वापस कर सकता है। या, ज़ाहिर है, यह कभी-कभी किसी नए ऑब्जेक्ट का संदर्भ वापस ले सकता है, और कभी-कभी पहले बनाए गए एक को।


ध्यान दें कि, यदि आप एक चर के लिए एक नया मान असाइन करते हैं, तो पहले जो भी चर है, उसे भुला दिया जाएगा। अगर भूल गए मान कुछ ऑब्जेक्ट का अंतिम संदर्भ होता है, तो उस ऑब्जेक्ट को जावा के कचरा कलेक्टर द्वारा ही नष्ट कर दिया जाएगा।

तो, उदाहरण के लिए, यह निश्चित रूप से है, जबकि संभव कुछ इस तरह करना है:

MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo 
foo = getSomeObject();  // forget the previous content of foo and replace it with whatever getSomeObject() returns 

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

new MyClass();  // create a new object and throw away(!) the reference to it 
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo 

केवल समय है कि यहां तक ​​कि दूर से कर सकता है अगर आप एक नया MyClass उदाहरण बना सकते हैं और तुरंत यह कचरा एकत्र हो, उदा जाने के लिए चाहता था समझ में होगा: वास्तव में, कोड ऊपर बिल्कुल के बराबर है क्योंकि MyClass कन्स्ट्रक्टर का कुछ साइड इफेक्ट था जिसे आप ट्रिगर करना चाहते थे। लेकिन चूंकि इसे आमतौर पर रचनाकारों के लिए गैर-तुच्छ दुष्प्रभाव (या अधिक आम तौर पर, नई वस्तु को स्थापित करने के अलावा कुछ भी करने के लिए) के लिए खराब शैली माना जाता है, इसलिए आपको सामान्य रूप से ऐसे कोड लिखने का कोई बहाना नहीं होना चाहिए।

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