2012-02-12 10 views
15

मैं कक्षा जीयूआई है तो मैं इस तरह वस्तु बना सकते हैं:जावा में संदर्भ और वस्तुओं के बीच क्या अंतर है?

GUI g1 = new GUI(); 

और इस तरह एक संदर्भ चर:

GUI g2; 

अब के रूप में ज्यादा मुझे पता है, G2 एक संदर्भ चर जो संदर्भ देता है जीयूआई कक्षा और जी 1 के लिए जीयूआई कक्षा का एक वस्तु है। जी 1 और जी 2 के बीच क्या अंतर है? मैं वस्तु के साथ जीयूआई कक्षा की संपत्ति का उपयोग कर सकता हूं लेकिन जी 2 का संभावित उपयोग क्या है?

+2

मुझे लगता है कि आप अपने कोड में जी 2 का उपयोग नहीं कर सकते हैं, क्योंकि इसे अभी तक शुरू नहीं किया गया है और यह शून्य है। – evilone

+3

जी 1 एक संदर्भ भी है! –

+2

मुझे लगता है कि इस सवाल को चारों ओर रखने के लिए एक अच्छा जवाब देने योग्य है! – slezica

उत्तर

22

संदर्भ नाम हैं। ऑब्जेक्ट्स सामान हैं। आपके पास सामान के लिए अलग-अलग नाम हो सकते हैं, यहां तक ​​कि उन सामानों के लिए भी जो वास्तव में मौजूद नहीं हैं।

आप के नाम घोषित कर सकते हैं, वास्तव में उन्हें देने के बिना किसी भी "असली" जिसका अर्थ है, इस तरह:

:

GUI g1; 

आप = ऑपरेटर के साथ नाम को अर्थ (असली सामान का उल्लेख करने के लिए) प्रदान कर सकते हैं

GUI g1 = some_gui; 

नाम समय के साथ अपना अर्थ बदल सकते हैं। इतिहास में विभिन्न बिंदुओं पर एक ही नाम विभिन्न चीजों को संदर्भित कर सकता है।

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

वहाँ भी समानार्थक शब्द हैं: कई नामों एक ही बात का उल्लेख कर सकते हैं:

GUI g2 = g1; 

कि काफी संदर्भ क्या करना है। वे सामानों के संदर्भ में नाम हैं।

सामग्री बनाया जा सकता है:

new GUI(); 

सामग्री बनाए जा सकते हैं और बाद में संदर्भ के लिए मौके पर ही नामित (शाब्दिक!):

GUI g1 = new GUI(); 

और सामान जैसा कि इसके नाम का उपयोग करते हुए, कहा जा सकता है (या इसके नामों में से कोई भी!):

g1.doSomething(); 
g2.doSomethingAgain(); 

उसी प्रकार की विभिन्न सामग्री (कक्षा) बनाई जा सकती है, और नाम अलग ढंग से एड:

GUI g1 = new GUI(); 
GUI g2 = new GUI(); 
GUI g3 = new GUI(); 

GUI g1_synonym = g1; 

:)

+2

ग्रेट पहला पैराग्राफ होना चाहिए। ओओपी विचारों को पेश करने का अच्छा तरीका। –

5

आप g2 उपयोग करने के लिए जब तक आप इसे करने के लिए एक वस्तु असाइन करते हैं, के बाद से वर्तमान में यह, किसी भी वस्तु को इंगित नहीं करता, जबकि g1 पहले से ही एक GUI वस्तु की ओर इशारा करता है और आप इसे उपयोग कर सकते हैं सक्षम नहीं हैं।

यह:

GUI g1; 
g1 = new GUI(); 
2

वस्तुओं एक अंतरिक्ष ढेर कहा जाता है के माध्यम से चल बुलबुले की तरह कर रहे हैं:

GUI g1 = new GUI(); 

को काफी बराबर है। चर केवल इन बुलबुले के लिंक हैं। अभिव्यक्ति new GUI() एक ऑब्जेक्ट बनाता है और = ऑपरेटर इसे g1 पर लिंक करता है। g2 भी एक चर है लेकिन यह किसी भी वस्तु से जुड़ा नहीं है। आप उन्हें आसानी से

g2 = g1; 
g1 = null; 

लिख अब से स्वैप कर सकते हैं g2 उद्देश्य यह है कि g1 शुरुआत में करने के लिए बात कर रहे थे करने के लिए संदर्भित करता है, और कुछ भी नहीं g1 को दर्शाता है। वस्तु बरकरार है, केवल चर बदल गया था।

0

वास्तव में आपके चर के जावा नाम में एक संदर्भ है (आदिम प्रकारों को छोड़कर)। आप g2 का उपयोग नहीं कर सकते क्योंकि इसे प्रारंभ नहीं किया गया था और यहां तक ​​कि शून्य नहीं है। आपको g2 के लिए विधि कॉल करने का प्रयास करने में एक संकलन समय त्रुटि मिलेगी। GUI g2; g2 के बाद स्मृति में किसी ऑब्जेक्ट को इंगित नहीं कर रहा है। यदि आप g2 को इस GUI g2 = null; की तरह शून्य करने के लिए सेट करते हैं तो आप घोषणा के बाद इसका उपयोग कर सकते हैं, लेकिन यदि आप g2 के लिए कोई विधि कॉल करते हैं तो आपको रन टाइम NullPointerException मिलेगा।

0

दोनों, जी 1 और जी 2 संदर्भ हैं। लेकिन जी 2 शुरू नहीं हुआ है, इसलिए कोड में इस्तेमाल नहीं किया जा सका।

//Tells that g1 g2 should hold Gui object. Currently they are not holding any object. 
Gui g1; 
Gui g2; 

//Now g1 reference holds object. g2 reference still doesn't point to any object. 
g1 = new GUI(); 
11

संदर्भ और जावा में वस्तुओं के बीच क्या अंतर है?

एक संदर्भ एक इकाई है जो अपने प्रकार की वस्तु तक पहुंचने का एक तरीका प्रदान करती है। एक वस्तु एक इकाई है जो इसके वर्ग या प्रकार के सदस्यों तक पहुंचने का एक तरीका प्रदान करती है।

आम तौर पर, आप इसके संदर्भ के बिना किसी ऑब्जेक्ट तक नहीं पहुंच सकते हैं।

class GUI 
{ 
    void aMethod() 
    { 
     // some business logic. 
    } 
} 

आप संदर्भ के साथ या बिना aMethod पर कॉल कर सकते हैं। लेकिन आपको निश्चित रूप से एक वस्तु की आवश्यकता है।

GUI aGUIReference = new GUI(); 
aGUIReference.aMethod(); 
// Now, the object can be reused. 
// Preferred way to code 

अब आप अपने कोड लाइनों के लिए एक छोटे से स्पष्टीकरण:

GUI g1 = new GUI(); 
// g1 is a reference to an object of GUI class. 

GUI g2; 
// g2 is a reference that can point to an object of GUI class 
// but currently not pointing to any. 

/डब्ल्यू g1 ख फर्क सिर्फ इतना है

new GUI().aMethod(); 
// you can't reuse the object 
// bad way to code. 
संदर्भ के साथ

:

संदर्भ के बिना

और g2 कि g1null

g2 = g1; 
// it means g2 will point to the same object g1 is pointing to 
// only one object but two references. 
+1

यह सही उत्तर है। –

+2

यह स्वीकार्य उत्तर – wfunston

0

संदर्भ नाम हैं करने के लिए एक वस्तु लेकिन g2 अंकों के साथ आरंभ नहीं हो जाता है। ऑब्जेक्ट्स सामान हैं। आपके पास सामान के लिए अलग-अलग नाम हो सकते हैं, यहां तक ​​कि उन सामानों के लिए भी जो वास्तव में मौजूद नहीं हैं।

आप, नाम घोषित कर सकते हैं वास्तव में उन्हें किसी भी "असली" जिसका अर्थ है, इस तरह दिए बिना:

GUI g1; 

नाम समय के साथ उनके अर्थ बदल सकते हैं। एक ही नाम अलग-अलग चीजों को अलग-अलग समय पर संदर्भित कर सकता है।

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

यह काफी संदर्भ है। वे सामानों के संदर्भ में नाम हैं।

सामग्री बनाया जा सकता है:

new GUI(); 

सामग्री बनाया जा सकता है और बाद में संदर्भ के लिए मौके पर ही नामित (शाब्दिक!):

GUI g1 = new GUI(); 

:)

0

एक संदर्भ एक "हुक" जहां पर एक वस्तु लटका कर सकते हैं। एक वस्तु एक से अधिक हुक पर हो सकती है।

3

Referencesobjects.

GUI g1 = new GUI(); 

स्पष्टीकरण के लिए कहा जाता है स्मृति का एक ब्लॉक करने के लिए संकेत की तरह कर रहे हैं, मुझे ऊपर बयान को तोड़ देते हैं।

GUI g1; 
g1 = new GUI(); 

1 कदम: g1 एक संदर्भ चर (सूचक) है, फिर भी किसी भी मान्य स्मृति स्थान की ओर संकेत नहीं।

दूसरा चरण: दूसरा चरण कक्षा GUI की वस्तु के लिए स्मृति आवंटित करता है और असाइनमेंट ऑपरेशन संदर्भ वस्तु g1 इस ऑब्जेक्ट (स्मृति स्थान) को संदर्भित करता है। new कीवर्ड कक्षा GUI की वस्तु के लिए स्मृति आवंटित करता है।