2012-06-13 19 views
16

मैं जावा में नया हूं और ऑब्जेक्ट असाइनमेंट के संबंध में मेरे कुछ प्रश्न हैं। उदाहरण के लिए,जावा ऑब्जेक्ट असाइनमेंट

Test t1 = new Test(); 
Test t2 = t1; 
t1.i=1; 

मान लिया जाये कि चर i टेस्ट वर्ग के भीतर परिभाषित किया गया है, मैं सही एक ही वस्तु जहां संशोधन t1.i=1 दोनों t1 और t2 को प्रभावित करता है करने के लिए दोनों t1 और t2 बिंदु ग्रहण करने के लिए कर रहा हूँ? असल में मैंने इसका परीक्षण किया और ऐसा लगता है कि मैं सही था। हालांकि जब मैं String पर एक ही चीज़ का प्रयास करता हूं, तो संशोधन केवल एक तरफ होता है जहां दूसरी तरफ अप्रभावित होता है। इसके पीछे का कारण क्या है?

संपादित करें: जिस मामले में मैंने स्ट्रिंग के साथ प्रयास किया था।

String s1 = "0"; 
String s2 = s1;   
s1 = "1"; 
System.out.println(s1); 
System.out.println(s2); 

मुझे स्ट्रिंग पर मामलों का परीक्षण करके मेरी गलती का एहसास है क्योंकि यह अपरिवर्तनीय है। जिस स्थिति में मैंने s1="1" को संशोधित किया था, वास्तव में स्ट्रिंग को एस 1 में "1" के संदर्भ को वापस कर रहा है। फिर भी, मेरा सवाल बनी हुई है। क्या Test t2 = t1; दोनों एक ही ऑब्जेक्ट में t2 और t1 बिंदु दोनों का कारण बनता है या अब प्रत्येक के पास अपनी ऑब्जेक्ट्स हैं? क्या यह स्थिति जावा पर सभी ऑब्जेक्ट्स पर लागू होती है?

+0

'स्ट्रिंग पर एक ही चीज़ की कोशिश करें' के तहत आपका क्या मतलब है? स्ट्रिंग को संशोधित करने के लिए स्ट्रिंग ऑब्जेक्ट में कोई विधि नहीं है। कृपया ध्यान से दस्तावेज पढ़ें। – DRCB

+0

यदि आप स्ट्रिंग पर कर रहे परीक्षण के कोड को पोस्ट करते हैं, तो हम गलत क्या कर रहे हैं, इस पर अधिक विशिष्ट हो सकते हैं –

उत्तर

14

आप सही हैं, लेकिन स्ट्रिंग्स एक विशेष मामला हैं; वे अपरिवर्तनीय हैं और इस मामले में प्राइमेटिव की तरह कार्य करते हैं।

@newacct

मैं http://docs.oracle.com/javase/tutorial/java/data/strings.html बोली:

नोट: स्ट्रिंग वर्ग, अपरिवर्तनीय है तो एक बार इसे बनाया जाता है एक स्ट्रिंग वस्तु नहीं बदला जा सकता है। स्ट्रिंग क्लास में विधियों की संख्या है, जिनमें से कुछ पर चर्चा की जाएगी, जो स्ट्रिंग को संशोधित करते हैं। चूंकि तार अपरिवर्तनीय हैं, इन तरीकों से वास्तव में क्या एक नई स्ट्रिंग बना और वापस कर रहा है जिसमें ऑपरेशन का परिणाम शामिल है।

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

@ user1238193

अपने निम्नलिखित प्रश्न को ध्यान में रखते: "टेस्ट t2 = t1 है, एक ही वस्तु के लिए दोनों t2 और t1 बिंदु कारण या प्रत्येक अब अपने स्वयं के वस्तुओं है जावा पर सभी वस्तुओं पर लागू होता है इस स्थिति है?? "

टी 1 और टी 2 एक ही वस्तु को इंगित करेंगे। यह किसी भी जावा ऑब्जेक्ट (अपरिवर्तनीय वस्तुओं को शामिल करने के लिए)

+2

कोई" विशेष मामले "नहीं हैं। किसी भी प्रकार के संदर्भ में असाइनमेंट उस ऑब्जेक्ट को बदलता है जो उस बिंदु को बदलता है, जिस पर ऑब्जेक्ट को इंगित करने के लिए उपयोग किया जाता है। – newacct

+0

स्ट्रिंग्स एक विशेष मामला हैं; वे वस्तुएं हैं, लेकिन वे अपरिवर्तनीय हैं, जिसका अर्थ है कि यदि आप उन्हें उदाहरण के लिए बदलना चाहते हैं उदाहरण के लिए String.replace आपको उसी वस्तु के बदले एक नई वस्तु मिल जाएगी। – Tom

+2

नहीं, 'स्ट्रिंग' में ऐसा कोई तरीका नहीं है जो इसे बदलता है। "उन्हें बदलने की कोशिश करें" समझ में नहीं आता है; आप ऐसा कुछ करने की कोशिश नहीं कर सकते जो मौजूद नहीं है। 'String.replace' आपको एक नई वस्तु देता है - आपका क्या मतलब है? यही दस्तावेज कहता है कि यह करेगा। 'इंटीजर' और कई अन्य वर्ग अपरिवर्तनीय हैं। आप खेतों को निजी बनाकर और अपने खेतों को बदलने के लिए कोई तरीका नहीं देकर अपरिवर्तनीय कक्षा को लिख सकते हैं। और किसी भी मामले में, उत्परिवर्तन प्रश्न के लिए अप्रासंगिक है, जो मूल रूप से 'टेस्ट' पर एक फ़ील्ड बदलने के बारे में था, लेकिन 'स्ट्रिंग' – newacct

3

आप बिल्कुल सही हैं, क्योंकि टी 1 और टी 2 दोनों एक ही वस्तु को प्रतिबिंबित करते हैं, ऑब्जेक्ट स्थिति में कोई भी श्रृंखला दोनों को प्रभावित करेगी।

स्ट्रिंग एक अपरिवर्तनीय वस्तु है। तो इसे बिल्कुल संशोधित नहीं किया जा सकता है। जावा में अपरिवर्तनीय वस्तु पर अधिक जानकारी के लिए see this

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html –

+0

जो समस्या की व्याख्या नहीं करता है। वही बात 'टेस्ट' के बारे में सच है: 'टेस्ट एस 1 = नया टेस्ट (2); टेस्ट एस 2 = एस 1; एस 1 = नया टेस्ट (1); ' – newacct

2

String objects are immutable के लिए सच है।


संपादित

करता Test t2 = t1; कारण दोनों t2 और एक ही वस्तु या प्रत्येक अब अपने स्वयं के वस्तुओं के लिए t1 बिंदु?

हां। हालांकि t2 एक नया संदर्भ है, लेकिन यह वही ऑब्जेक्ट इंगित करेगा, क्योंकि आपने ऐसा करने के लिए कहा था। Test टाइप करने के लिए एक नया संदर्भ t2 बनाएं और इसे उसी ऑब्जेक्ट पर इंगित करें जो t1 इंगित कर रहा है।

लेकिन, जब आप String एस के साथ ऐसा करते हैं और फिर s1 = "1" ; जैसे कुछ करते हैं तो आप किसी अन्य स्ट्रिंग ऑब्जेक्ट पर s1 बिंदु बना रहे हैं। आप इसे s1 = new String(1); के संदर्भ में सोच सकते हैं।

+0

जैसे इंटर्निंग पूल हो सकते हैं या नहीं, जो समस्या की व्याख्या नहीं करता है। वही बात 'टेस्ट' के बारे में सच है: 'टेस्ट एस 1 = नया टेस्ट (2); टेस्ट एस 2 = एस 1; एस 1 = नया टेस्ट (1); ' – newacct

+0

@ न्यूवेक्ट ओपी ने बाद में पोस्ट संपादित किया। प्रारंभिक पोस्ट केवल इन कुछ शब्दों के साथ उत्तरदायी था। मैं अब अपनी पोस्ट संपादित करूंगा। हालांकि इसे इंगित करने के लिए धन्यवाद। –

+0

संपादन से पहले भी, "स्ट्रिंग अपरिवर्तनीय है" सही उत्तर नहीं है। उन्होंने कहा "जब मैंने स्ट्रिंग पर एक ही चीज़ की कोशिश की"; जवाब होना चाहिए "जो आपने कहा वह असंभव है। स्ट्रिंग को एक ही चीज़ करना असंभव है" – newacct

1

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

लेकिन ध्यान रखें कि स्ट्रिंग में कोई फ़ील्ड नहीं है जिसे आप टेस्ट पर करते हैं जैसे सेट कर सकते हैं, इसलिए आप मूल रूप से एक ही परीक्षण नहीं कर सकते हैं, इसलिए टेस्ट ऑब्जेक्ट से स्ट्रिंग ऑब्जेक्ट में अपना कोड पोर्ट करने का कोई तरीका नहीं है।

आप आदिम प्रकार, इस तरह के लंबे इंट आदि वे "मूल्य से" चर को सौंपा जाता है का उपयोग कर विपरीत व्यवहार मिलता है, इसलिए अगर आप

int t1 = 12; 
int t2 = t1; 
t1=15; 

t2 अभी भी महत्व है 12

5

आप आपकी पहली धारणा के साथ सही हैं। कोड की निम्न पंक्ति के साथ:

Test t1 = new Test(); 

आप एक नया टेस्ट वस्तु बनाने, और एक ही समय में आप एक टेस्ट संदर्भ में यह उल्लेख करने के लिए नामित किया गया t1 पैदा करते हैं।

कोड की दूसरी पंक्ति में आप पोस्ट:

Test t2 = t1; 

आप वास्तव में एक और टेस्ट संदर्भ बना रहे हैं, और आप इसे एक ही वस्तु का उल्लेख करने कि t1 को संदर्भित करता है आवंटित।

तो t1.i = 1;t2.i को प्रभावित करेगा क्योंकि यह सभी के बाद एक ही वस्तु है।

स्ट्रिंग्स के लिए, स्ट्रिंग्स अपरिवर्तनीय हैं और तत्काल बाद संशोधित नहीं किए जा सकते हैं।

अपने संपादित के बारे में:

String s1 = "0"; 
String s2 = s1;   
s1 = "1"; 
System.out.println(s1); 
System.out.println(s2); 

वे विभिन्न परिणामों को मुद्रित होगा, क्योंकि जब आप वास्तव में कहना

s1 = "1"; 

आप वास्तव में एक और स्ट्रिंग ऑब्जेक्ट के एस 1 बाध्यकारी हैं, लेकिन s2 अभी भी की चर्चा करते हुए किया जाएगा मूल्य "0" के साथ वस्तु।

2

आप दो मामलों में पूरी तरह से अलग चीजें कर रहे हैं। पहले मामले में, t1.i = 1; के साथ, आप ऑब्जेक्ट को t1 पर इंगित कर रहे हैं।दूसरे मामले में, t1 = "1"; के साथ, आप संदर्भ किसी अन्य वस्तु (जब आप t2 = t1; किया समान करने के लिए बात करने के लिए बदल रहे हैं।

आप Test है कि आप दूसरे मामले में किया था करने के लिए एक ही बात करते हैं, तो आप मिलेगा एक ही परिणाम (यह मानते हुए Test एक निर्माता कि एक पूर्णांक लेता है):।

Test t1 = new Test(5); 
Test t2 = t1;   
t2 = new Test(1); // Here we are assigning to the variable, just like your 2nd example 
System.out.println(t1); 
System.out.println(t2); 

लोग उल्लेख है कि String अपरिवर्तनीय है लेकिन वह अप्रासंगिक है और वहाँ "अस्थिरता" भाषा में की धारणा नहीं है और वहाँ कोई अंतर नहीं है कैसे "उत्परिवर्तनीय" और "अपरिवर्तनीय" कक्षाएं काम करती हैं। हम अनौपचारिक रूप से कहते हैं कि एक वर्ग "अपरिवर्तनीय" है यदि ऐसा कोई फ़िल नहीं होता है डीएस आप सेट कर सकते हैं या कोई भी तरीका जो अपनी आंतरिक सामग्री को बदल सकता है। String के साथ ऐसा ही मामला है। लेकिन एक उत्परिवर्तनीय वर्ग उसी तरह काम करेगा यदि आप इसे बदलने के लिए कुछ भी नहीं करते हैं।

+0

अन्य उत्तरों पर डाउनवॉटिंग और टिप्पणी करने से पहले, कृपया प्रश्न संपादित इतिहास को देखने के लिए कृपया परेशान करें। इससे आपको एक संकेत मिलेगा कि एक ही बात कहकर, कई जवाब क्यों उठाए गए थे। –

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

  • कोई संबंधित समस्या नहीं^_^