2016-01-28 50 views
7

क्या यह संकलक है या रनटाइम ऑटो-मुक्केबाजी/अनबॉक्सिंग करता है?ऑटो-मुक्केबाजी/अनबॉक्सिंग कौन करेगा?

निम्न उदाहरण पर विचार करें:

public Integer get() { 
    return 1; //(1) 
} 

पर (1), आदिम पूर्णांक मान new Integer(1) की तरह कुछ में बदल दिया जाएगा, और लौट आए। यह प्रभावी रूप से ऑटो-मुक्केबाजी के रूप में जाना जाने वाला किसी प्रकार का निषेध अभिसरण है, लेकिन वह कौन करेगा? कंपाइलर, या जेवीएम?

मैं बस एएसएम सीखना शुरू कर रहा था, और ऐसे मुक्केबाजी मुद्दे ने मुझे वास्तव में भ्रमित कर दिया।

+0

इस पर विचार करें: int a = myScan.nextInt(); इंटीजर बी = ए; कंपाइलर यह कैसे करेगा, यह जानने में सक्षम होगा कि एक मूल्य क्या होगा? – Stultuske

+0

@Stultuske संकलक 'इंटीजर बी = Integer.valueOf (ए); '। सरल। इसे 'ए' के मूल्य को जानने की आवश्यकता नहीं है। इस प्रश्न के स्वीकृत उत्तर भी देखें। –

उत्तर

11

आप javap -c आदेश का उपयोग disassembled कोड देख सकते हैं:

public class Example { 
    public Example(); 
    Code: 
     0: aload_0 
     1: invokespecial #1 // Method java/lang/Object."<init>":()V 
     4: return 

    public java.lang.Integer get(); 
    Code: 
     0: iconst_1 
     1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     4: areturn 
} 

आप देख सकते हैं कि Integer#valueOf लागू किया गया था, इसलिए वास्तविक कोड में अनुवाद किया जाता है:

public Integer get(){ 
    return Integer.valueOf(1); 
} 

निष्कर्ष :

कंपाइलर यह आपके लिए करता है।

+0

धन्यवाद, तो अब मुझे अपने कोड में कई अन्य लाइनें जोड़नी है ... – glee8e

1

ऑटोबॉक्सिंग स्वचालित रूपांतरण है कि जावा कंपाइलर आदिम प्रकारों और उनके संबंधित ऑब्जेक्ट रैपर वर्गों के बीच बनाता है।

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

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