2015-05-21 8 views
12

ओवरलोडिंग के लिए लागू नहीं होती है मेरी कास्टिंग क्लास में, शिक्षक ने हमें निम्नानुसार एक दिलचस्प तथ्य सिखाया।अंतिम कास्टिंग अवधारणा

class Casting { 
    public static void main(String args[]){ 
     int i = 10; 
     byte b = i; 
     System.out.println(b); 
    } 
} 

हमने एक त्रुटि

java:5: possible loss of precision 

मिला और जैसा कि

class Casting1 { 
    public static void main(String args[]){ 
     final int i = 10; 
     byte b = i; 
     System.out.println(10); 
    } 
} 

10 

इस प्रकार हम सही उत्पादन मिल गया तो हम कोड बदल दिया है। कारण के लिए, उन्होंने कहा कि जब हम एक चर final संशोधित करते हैं तो चर को सबसे छोटे डेटा प्रकार में संग्रहीत किया जाता है। इस मामले में byte था। यही कारण है कि हम कास्ट कीवर्ड का उपयोग किए बिना इसे कास्ट करने में सक्षम थे।

लेकिन जब हम इस तरह विधि ओवरलोडिंग,

class A { 
    void m(int i){ 
     System.out.println("int"); 
    } 
    void m(byte b){ 
     System.out.println("byte"); 
    } 
    public static void main(String args[]){ 
     A a1 = new A(); 
     final int i = 10; 
     a1.m(i); 
    } 
} 

का उपयोग मैं उत्पादन int मिलता है। यदि अंतिम चर सबसे कम संभव डेटा प्रकार में संग्रहीत हैं, तो यह byte होना चाहिए। तो मैंने ओवरलोडिंग के बिना निम्नलिखित कोड की कोशिश की।

class A { 
    void m(byte b){ 
     System.out.println("byte"); 
    } 
    public static void main(String args[]){ 
     A a1 = new A(); 
     final int i = 10; 
     a1.m(i); 
    } 
} 

java:9: m(byte) in A cannot be applied to (int) 

इसका क्या कारण है? क्या कोई मुद्दा है कि मैंने गलत समझा है?

+1

अंतिम के साथ उदाहरण में, आप निरंतर 10 को println पर पास करते हैं। शायद बी होना चाहिए। आपको यह जांचना चाहिए कि यह टाइपो आपके कोड में मौजूद है या नहीं, यह परिणाम बदल सकता है? –

+0

पहला उदाहरण मुझे देता है एक संकलन त्रुटि: मिस्चैच टाइप करें: int से बाइट में कनवर्ट नहीं किया जा सकता है। दूसरा उदाहरण (अंतिम के साथ) संकलन पास करता है –

+0

@sharonbn हाँ, यह कैसा होना चाहिए। मैंने उल्लेख किया है कि मुझे एक त्रुटि मिली है –

उत्तर

2

आप चर और उनके प्रकार की मेमोरी स्पेस को मिश्रित कर रहे हैं। विधि एम (...) को कॉल करना सबसे पहले चरम चर के प्रकार की जांच करेगा। यहां यह एक int है इसलिए यह अतिरिक्त अधिभारित विधि को चुना जाएगा, चाहे स्मृति में int का आकार चाहे।

हालांकि मैं वास्तव में आपको पहले उदाहरण की प्रशंसा करता हूं जो प्रकाश को अंतिम पहचानकर्ता की विशेषताओं में से एक में लाता है।

0

Is there any point that I have misunderstood?

हां। आवेदन करने की विधि किस प्रकार की खोज तर्कों के प्रकारों पर निर्भर करती है। असाइनमेंट के मामले के विपरीत, विधि तर्कों के लिए कोई रूपांतरण प्रयास नहीं है (कम से कम, भाषा में ऑटोबॉक्सिंग जोड़ा गया था, जो मनमाने ढंग से नियमों का एक और सेट जोड़ता है)।

0

यदि रूपांतरण एक असाइनमेंट का हिस्सा है, और मान byte में फिट हो सकता है, तो संकलक स्वचालित रूप से आपके लिए रूपांतरण करता है।

JLS स्पष्ट रूप से बताता है कि यह एक विशेष मामला है जो केवल असाइनमेंट पर लागू होता है और अन्य संदर्भों में रूपांतरण नहीं करता है।

यह उल्लेखनीय है कि byte केवल तब उपयोगी होता है जब आप एम्बेडेड डिवाइस के लिए प्रोग्राम करते हैं या फ़ाइलों/नेटवर्क से निपटते हैं। byte और int एक ही स्थान पर कब्जा करते हैं क्योंकि चर के पते गठबंधन होते हैं।

2

इस बिट काफी सही नहीं है ...

"जैसा कि कारण के लिए, उसने बताया कि जब हम एक चर अंतिम चर संशोधित छोटी से छोटी डेटा संभव प्रकार में संग्रहित है। में इस मामले एक था बाइट।"

यह नहीं करता है; टी एक बाइट के रूप में यह दुकान, यह एक पूर्णांक के रूप में यह संग्रहीत करता है, लेकिन यह प्रभावी रूप से एक स्थिर है इसलिए जब जावा लाइन byte b = i; संकलित यह सुनिश्चित करने के लिए जानता है कि मान 10 जो नहीं करता है 'हो जाएगा, टी को कास्टिंग की जरूरत है।

+0

धन्यवाद सही –

+0

@ फिल, आपके उत्तर में आपने बताया है कि "अंतिम चर को कास्टिंग की आवश्यकता नहीं है"। क्या आप इस कथन को स्पष्ट कर सकते हैं? –

+1

@ एनील: ज़रूर! ऐसा नहीं है कि अंतिम चर को प्रति से कास्टिंग की आवश्यकता नहीं है। यह सिर्फ इतना है कि जावा कंपाइलर प्रभावी ढंग से उन्हें स्थिरांक की तरह व्यवहार कर सकता है, क्योंकि यह जानता है कि वे कभी नहीं बदलेंगे। तो ... बाइट बी = मैं बाइट बी = 10 के समान है जिसे कास्टिंग की आवश्यकता नहीं है। क्या इससे यह स्पष्ट हो जाता है? –

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