2012-02-28 13 views
10
public class J { 

    public Integer method(Integer x) 
     { 
      Integer val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x + x; 
      } 
     } 
     public static void main(String[] args) 
     { 
      J littleFuzzy = new J(); 
      System.out.println(littleFuzzy.method(new Integer(10))); 
     } 

} 

यह "10" वापस आ जाएगा।कैच में वापसी विवरण का व्यवहार और अंत में

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

public class I { 

    public StringBuilder method(StringBuilder x) 
     { 
      StringBuilder val = x; 
      try 
      { 

        return val; 
      } 
      finally 
      { 
        val = x.append("aaa"); 
      } 
     } 
     public static void main(String[] args) 
     { 
      I littleFuzzy = new I(); 
      System.out.println(littleFuzzy.method(new StringBuilder("abc"))); 
     } 


} 

उत्पादन "abcaaa"

तो, किसी को विस्तार से मुझे समझा सकता है।? अंतर क्या हैं।

+0

जब भी मैंने अपनी मशीन पर इस कार्यक्रम को निष्पादित किया तो मैं भी उलझन में हूं। पहले मामले में यह 10 लौटाता है (मुझे उम्मीद थी कि यह 20 वापस आ जाएगा), दूसरे मामले में यह अब्बाआ (जो संलग्न होने के बाद है) लौट रहा है। मैं इस व्यवहार पर भी परेशान हूं। (बीच में मैं वह नहीं हूं जिसने इसे ऊपर उठाया है।) – JProgrammer

+0

यह एक अच्छा सवाल है। बुनियादी की कुछ यादें वापस मिला। इसमें गलत क्या है ? – Siddharth

उत्तर

4

सिर्फ इसलिए कि immutable में पूर्णांक तो विधि के बाद रिटर्न भले ही मूल्य विधि यह प्रतिबिंबित नहीं करता है में बदल गया है, और StringBuilder वस्तु में प्रतिबिंबित करता है

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

public class J { 
    public String method(String x) { 
     String val = x; 
     try { 
      return val; 
     } finally { 
      val = x + x; 
     } 
    } 

    public static void main(String[] args) { 
     J littleFuzzy = new J(); 
     System.out.println(littleFuzzy.method("abc")); 
    } 
} 
+0

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

+0

निष्पादित करें यदि आप 'रिटर्न वैल' रखते हैं, 'अंत में' बाहर 'तो' इंटीगर ' – Shahzeb

+0

@ निर्मल-थिंकबेयंड के लिए भी मूल्य बदल दिया गया है, क्या आपको यकीन है कि यह मामला है? मुझे लगता है कि रिटर्न वैल्यू हमेशा पैरामीटर के रूप में होता है जैसे i.e. 'x'। और 'स्ट्रिंगबिल्डर' विधि के मामले में x के मान को 'append()' विधि को कॉल करके बदला जाता है, यह लौटा मूल्य में दिखाई देता है। 'Val = x.append (" aaa ") को बदलने का प्रयास करें;' 'val = new Stringbuilder (" aaa ") के साथ' 'स्ट्रिंगबिल्डर विधि (स्ट्रिंगबिल्डर x)' के मामले में। –

0

स्ट्रिंगबिल्डर पर प्रमुख संचालन संलग्न और सम्मिलित विधियां हैं, जिन्हें ओवरलोड किया गया है ताकि किसी भी प्रकार के डेटा को स्वीकार किया जा सके। प्रत्येक प्रभावी रूप से एक दिए गए डेटाम को एक स्ट्रिंग में परिवर्तित करता है और फिर स्ट्रिंग बिल्डर को उस स्ट्रिंग के अक्षरों को जोड़ता या सम्मिलित करता है। संलग्नक विधि हमेशा इन पात्रों को निर्माता के अंत में जोड़ती है; सम्मिलित विधि वर्णों को निर्दिष्ट बिंदु पर जोड़ती है।

उदाहरण के लिए, यदि z एक स्ट्रिंग बिल्डर ऑब्जेक्ट को संदर्भित करता है जिसका वर्तमान सामग्री "प्रारंभ" है, तो विधि कॉल z.append ("le") स्ट्रिंग बिल्डर को "स्टार्टल" रखने का कारण बनता है, जबकि z.insert (4, "ले") स्ट्रिंग बिल्डर को "स्टार्लेट" रखने के लिए बदल देगा।

सामान्य रूप से, यदि एसबीबी स्ट्रिंगबिल्डर के उदाहरण को संदर्भित करता है, तो sb.append (x) का sb.insert (sb.length(), x) जैसा ही प्रभाव होता है। प्रत्येक स्ट्रिंग बिल्डर की क्षमता होती है। जब तक स्ट्रिंग बिल्डर में वर्णित वर्ण अनुक्रम की लंबाई क्षमता से अधिक न हो, तब तक एक नया आंतरिक बफर आवंटित करना आवश्यक नहीं है। यदि आंतरिक बफर ओवरफ़्लो होता है, तो यह स्वचालित रूप से बड़ा हो जाता है।

स्ट्रिंगबिल्डर के उदाहरण एकाधिक धागे द्वारा उपयोग के लिए सुरक्षित नहीं हैं। यदि इस तरह के सिंक्रनाइज़ेशन की आवश्यकता है तो यह अनुशंसा की जाती है कि स्ट्रिंगबफर का उपयोग किया जाए।

उपर्युक्त विधि में, अंत में ब्लॉक हर बार कॉल कर रहा है।

0

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

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