2017-06-25 12 views
5

मुझे समझने में एक बड़ी समस्या है कि जावा में रैपर क्लास संदर्भ प्रकार की तरह व्यवहार क्यों नहीं करती है। उदाहरण:जावा में रैपर क्लास संदर्भ प्रकार की तरह व्यवहार क्यों नहीं करती है?

Integer one = 10; 
Integer two = one; 
one = 20; 
System.out.println(one); 
System.out.println(two); 

उत्पादन होगा:

मैंने सोचा था कि two इस उदाहरण जहां मैं अपने ही वर्ग बनाने में की तरह 20 हो जाएगा:

class OwnInteger { 
     private int integer; 

     public OwnInteger(int integer) { 
      this.integer = integer; 
     } 

     public int getInteger() { 
      return integer; 
     } 

     public void setInteger(int integer) { 
      this.integer = integer; 
     } 
    } 

    OwnInteger one = new OwnInteger(10); 
    OwnInteger two = one; 
    one.setInteger(20); 
    System.out.println(one.getInteger()); 
    System.out.println(two.getInteger()); 

तो सवाल, इंटीजर wra है पीपर वर्ग विशेष? जैसा कि मैंने अपने उदाहरणों में दिखाया है, यह क्यों व्यवहार करता है?

+4

'एक = 20; 'और' one.setInteger (20);' के बीच एक बड़ा अंतर है, और इसमें रैपर वर्गों के साथ कुछ लेना देना नहीं है। पहले स्निपेट का 'एक = 20;' 'एक = नया स्वामित्व (20);' दूसरे स्निपेट में बराबर होगा। – Eran

+1

ये कक्षाएं संदर्भ प्रकारों की तरह व्यवहार करती हैं, संभवतः क्योंकि वे _are_ संदर्भ प्रकार हैं। जब आप किसी भिन्न ऑब्जेक्ट के संदर्भ को इंगित करते हैं, तो आप अन्य पॉइंटर को नहीं बदलते हैं। पॉइंटर्स स्वतंत्र हैं। यह केवल _object_ में परिवर्तन है जो किसी भी पॉइंटर के माध्यम से उसी _object_ पर दिखाई देता है। याद रखें कि जेएलएस कहता है, जावा "संदर्भ ... पॉइंटर्स हैं"। –

उत्तर

8

के बराबर होगी यह ठीक एक संदर्भ के व्यवहार है प्रकार। आपके उदाहरण में, two असाइनमेंट के बाद one के समान ऑब्जेक्ट का संदर्भ देता है। हालांकि, one को फिर से असाइन करना two पर एक नई वस्तु का कोई प्रभाव नहीं पड़ता है, जो आप देखते हैं।

आप अन्य संदर्भ वस्तुओं के साथ समान व्यवहार एक संदर्भ वर्ग व्यवहार जब बदलते एक वस्तु अन्य बदलाव भी प्रदर्शन करने के लिए के लिए आदेश में उदाहरण

StringBuilder one = new StringBuilder("10"); 
StringBuilder two = one; 
one = new StringBuilder("20"); 
// two still references StringBuilder with "10" 

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

one = Integer.valueOf(20); 

अपने मामले valueOf विधि में एक नई वस्तु बनाने और कहा कि नव निर्मित वस्तु का एक संदर्भ लौट क्योंकि पहले से कैश में मौजूद नहीं:

3

मैंने सोचा था कि दो 20 ...

nop, हो जाएगा जब आप इस

Integer two = one; 
one = 20; 

कर आप वास्तव में चर one और चर करने के लिए एक नई वस्तु बताए जाते हैं two उन परिवर्तनों के साथ अपडेट नहीं किया जाएगा ...

आपकी कक्षा के लिए OwnInteteg एर

OwnInteger one = new OwnInteger(10); 
OwnInteger two = one; 
one.setInteger(20); 

वे आप क्या उम्मीद क्योंकि one और two एक ही संदर्भ ओर इशारा करते हैं ..

कोड A

OwnInteger one = new OwnInteger(10); 
OwnInteger two = one; 
one = new OwnInteger(20); //one.setInteger(20); 
+0

"एक और दो एक ही संदर्भ पर इशारा कर रहे हैं .." गलत, वे एक ही _object_ को इंगित कर रहे हैं। –

0
one = 20; 

"बॉक्सिंग" का उपयोग कर, और वास्तव में इस के बराबर है ।

अपने स्वयं के वर्ग one और two दोनों संदर्भ चर के लिए एक ही वस्तु की ओर इशारा करते रहे हैं।

+0

वही बात ऑटोबॉक्सिंग के बिना भी हुई होगी, जो ओपी के अवलोकन के कारण नहीं है। –

0

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

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