2008-10-03 20 views

उत्तर

11

जावा प्राइमेटिव्स के लिए ऑब्जेक्ट प्रकारों और मूल्य अर्थशास्त्र के लिए निहित सूचक अर्थशास्त्र का उपयोग कर रहा है।

वैल्यू अर्थशास्त्र का अर्थ है कि आप सीधे मूल्यों से निपटते हैं और आप प्रतियां पास करते हैं। यहां बिंदु यह है कि जब आपके पास कोई मूल्य होता है, तो आप भरोसा कर सकते हैं कि यह आपकी पीठ के पीछे नहीं बदलेगा।

पॉइंटर अर्थशास्त्र के साथ, आपके पास कोई मान नहीं है, आपके पास 'पता' है। कोई और वहां बदल सकता है जो आप वहां हैं, आप नहीं जानते। C++

सूचक शब्दार्थ:

void foo(Bar * b) ... 
... b->bar() ... 

आप सूचक अर्थ विज्ञान के लिए पूछने के लिए एक * की जरूरत है और -> pointee पर तरीकों कॉल करने के लिए।

जावा में अंतर्निहित सूचक शब्दार्थ:।

void foo(Bar b) ... 
... b.bar() ... 

जब से तुम मूल्य अर्थ विज्ञान का उपयोग करने का विकल्प नहीं है, के बीच * की जरूरत नहीं है और न ही भेद -> और, इसलिए निहित।

1

जावा चर का उपयोग कर सकते पर implicit pointer semantics का उपयोग करता है (यदि आप सीधे, संदर्भ संपादित नहीं कर सकते यह autmatically (छुपा हुआ) उपयोग पर वस्तु का संकल्प लिया जाता है) और यह भी विधि मानकों गुजर पर Pass-by-Value semantics उपयोग करता है।

पढ़ें Pass-by-value semantics in Java applications:

Java अनुप्रयोगों में, एक वस्तु संदर्भ के लिए एक विधि के लिए एक पैरामीटर है जब, आप संदर्भ की एक प्रति गुजर रहे हैं (मूल्य से गुजरती हैं), नहीं संदर्भ में ही । ध्यान दें कि कॉलिंग विधि के ऑब्जेक्ट संदर्भ और प्रतिलिपि उसी ऑब्जेक्ट पर इंगित कर रही है। यह एक महत्वपूर्ण भेद है। गुजरते समय विभिन्न प्रकार के पैरामीटर जैसे C++ पास करते समय जावा एप्लिकेशन कुछ अलग नहीं करता है। जावा अनुप्रयोग पैरामीटर मान द्वारा मानते हैं, इस प्रकार प्रकार के बावजूद सभी मानकों की प्रतियां बनाते हैं।

संक्षिप्त: जावा में सभी पैरामीटर मान द्वारा पारित किए जाते हैं। लेकिन इसका मतलब यह नहीं है कि ऑब्जेक्ट की प्रतिलिपि बनाई जाती है (PHP4 में डिफ़ॉल्ट की तरह), लेकिन उस ऑब्जेक्ट का संदर्भ कॉपी हो जाता है।

int x = 1; 
int y = x; 
x = 2; // y remains the same! 

एक विशेष मामला एक समारोह कॉल है:

आप Pass-by-value semantics in Java applications

10

असल पर सभी स्पष्टीकरण और में गहराई से उदाहरण देखेंगे, मूल्य अर्थ विज्ञान है कि एक से दूसरे मान निर्दिष्ट एक कॉपी बन का मतलब जो एक तर्क पारित हो जाता है:

void f(int x) { 
    x = 5; 
} 

int a = 1; 
f(a); 
// a is still 1 

यह वास्तव में जावा और सी ++ के लिए समान है। हालांकि, जावा केवल कुछ प्राचीन प्रकारों को जानता है, उनमें से int, double, boolean और char, इस तरह से प्रचलित enums के साथ। अन्य सभी प्रकार जिसका अर्थ है कि एक से दूसरे मूल्य का एक काम वास्तव में के बजाय अंतर्निहित मान को कॉपी करने की एक सूचक पुनर्निर्देश संदर्भ अर्थ विज्ञान का उपयोग करें:

class Foo { 
    int x; 

    public Foo(int x) { this.x = x; } 
} 

Foo a = new Foo(42); 
Foo b = a; // b and a share the same instance! 
a.x = 32; 
//b.x is now also changed. 

कुछ चेतावनियां लेकिन कर रहे हैं। उदाहरण के लिए, कई संदर्भ प्रकार (String, Integer ...) वास्तव में अपरिवर्तनीय हैं। उनका मूल्य बदला नहीं जा सकता है और उनके लिए कोई असाइनमेंट पुराने मूल्य को ओवरराइड करता है।

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

void f(Foo foo) { 
    foo.x = 42; 
} 

void g(Foo foo) { 
    foo = new Foo(42); 
} 

Foo a = new Foo(23); 
f(a); 
// a.x is now 42! 

Foo b = new Foo(1); 
g(b); 
// b remains unchanged! 
+0

क्यों विशेष मामला? – morbidCode

+0

@morbidCode क्या विशेष मामला? तर्क गुजर रहा है? यह वास्तव में एक विशेष मामला नहीं है, यह असाइनमेंट के समान व्यवहार करता है (यह * * असाइनमेंट असाइनमेंट नहीं है)। –

+0

मुझे यकीन नहीं है कि मुझे यह मिला है। क्या आपका मतलब है कि जब आप f (x) पास करते हैं, तो एक प्रतिलिपि बनाई जाती है, तो उस प्रति को मान 5 के रूप में निर्दिष्ट किया जाता है, इसलिए जब विधि वापस आती है तो प्रतिलिपि समाप्त हो जाती है और मूल का मान वही रहता है? – morbidCode

3

जावा मूल्य से पास होना जरूरी है। सी ++ दोनों, मूल्य और संदर्भ अर्थशास्त्र का उपयोग कर सकते हैं।

http://javadude.com/articles/passbyvalue.htm

+2

यह वर्णन जावा के छिपे हुए पॉइंटर्स के कारण भ्रामक है (भले ही पॉइंटर्स स्वयं पास हो जाएं मूल्य।) – finnw

+1

@finnw: मैं सहमत हूं, लेकिन फिर, जावा डेवलपर्स को अभी भी इस तरह समझना चाहिए, क्योंकि यदि वे किसी फ़ंक्शन के अंदर बिंदु डेटा को बदलने की उम्मीद करते हैं, तो वे आश्चर्यचकित होंगे कि मूल "संदर्भ" बाहर छोड़ा गया है। उनके लिए उनके "संदर्भ" को समझना महत्वपूर्ण है। – paercebal

+1

बार्टोस: लोगों को मेरे लेख को फैलाने में खुशी हुई;) finnw: "छिपी हुई" है कुंजी शब्द वहाँ ... हम जावा में किसी प्रोग्राम के बारे में बात कर रहे हैं। दृश्यों के पीछे कार्यान्वयन यांत्रिकी इस तथ्य को नहीं बदलता है कि जावा सख्ती से पास-दर-मूल्य है - इसे देखने के लिए जावा भाषा स्पेक पढ़ें बाहर। –

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