2010-12-08 18 views
5

ओवरलोडिंग, मैं इस वर्ग है:जावा। उदाहरण के लिए विधि

public class Col { 

static void test(int a) 
    { 
     System.out.println("int"); 
    } 
    public static void main(String args[]) 
    { 
     Col.test(12); //1 

     Col.test((byte)12); //2 

     Col.test((long)100); //3 

    } 
} 

और अब मुझे intresting कैसे एल्गोरिथ्म काम इस कोड। मुझे लगता है कि, ये चरण:

1 लाइन - int param, perfect के साथ सभी सही कॉल विधि।

2 लाइन - बाइट param के साथ कॉल विधि ... oooops। क्या करना है? जावा int को बाइट चौड़ा करने की कोशिश करो? यह सच है?

लंबे पैरा के साथ 3 लाइन कॉल विधि ... फिर से ओउप्स। क्या करना है? लंबे समय तक int java परिवर्तित नहीं कर सकते, क्योंकि सटीकता का नुकसान। इसकी कोशिश करो? और परिणामस्वरूप - अपवाद।

से मैं इस जोड़ें:

public static void test(Object a) 
    { 
     System.out.println("Object"); 
    } 

और एक कॉल करता है, तो:

Col.test((long)100); 

सब सही, कोई अपवाद हां, तो क्या आदिम प्रकार के बीच संबंध लंबी और वस्तु?

+0

ठीक है, धन्यवाद, पुरुष! – user471011

उत्तर

7

हाँ, वहाँ एक अंतर्निहित रूपांतरण byte से int के लिए, लेकिन int को long से कोई अंतर्निहित रूपांतरण (जानकारी को खोने की संभावना की वजह से) है।

तीसरे मामले में, आप autoboxing जो एक long (आदिम प्रकार) में परिवर्तित कर देंगे एक Long (कक्षा प्रकार) के लिए प्रयोग कर रहे हैं।

आप देख सकते हैं कि test के शरीर को बदलने के द्वारा:

public static void test(Object a) 
{ 
    System.out.println(a.getClass()); 
} 

यह तो class java.lang.Long बाहर प्रिंट होगा।

+0

+1 - 5 में से 2 उत्तरों में से एक जो प्रश्नों के दोनों सेटों को संबोधित करता है। –

2
public static void test(Object obj) { 
     if (obj instanceof Integer) { 
      System.out.println("Integer"); 
     } else if (obj instanceof Double) { 
      System.out.println("Double"); 
     } else if (obj instanceof Float) { 
      System.out.println("Float"); 
     } else if (obj instanceof Long) { 
      System.out.println("Long"); 
     } 
    } 
2

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

जो आपने अनुभव किया है वह मुक्केबाजी और अनबॉक्सिंग है।

2

यह जावा 5 में पेश की गई एक विशेषता है। इसे ऑटोबॉक्सिंग कहा जाता है। इसमें एक आदिम प्रकार ऑब्जेक्ट में परिवर्तित हो जाता है (आपके मामले में लंबे समय तक)। Autoboxing पर विवरण के लिए this link देखें।

4

आपका पहला उदाहरण आदिम प्रकारों का रूपांतरण दिखाता है। दूसरा मुक्केबाजी और अनबॉक्सिंग दिखाता है, जो संक्षेप में - प्राचीन प्रकार के बीच एक सुविधाजनक रूपांतरण (जैसे long) और उनके रैपर वर्ग (java.lang.Long इस मामले में)।

ओवरलोडिंग तरीकों है कि ही नाम लेकिन अलग मापदंडों लागू कर रहा है। यहां हमारे पास दो विधियां हैं

static void test(int a){} 
static void test(Object a){} 

और इसे test((long) 100) के साथ कॉल करें।पहली विधि को नहीं कहा जा सकता है, क्योंकि JVM एक long को int पर स्पष्ट कास्टिंग के बिना संकीर्ण नहीं करेगा। लेकिन JVM (संस्करण 1.5+) long मान को Long (ऑटोबॉक्सिंग) में परिवर्तित कर सकता है और test(Long.valueOf((long) 100)) दूसरी विधि के लिए एक अच्छा मिलान है।

+0

तो स्थिर शून्य परीक्षण (int ए) और स्थैतिक शून्य परीक्षण (ऑब्जेक्ट ए) ओवरलोडिंग का उदाहरण क्यों नहीं है? –

+0

@Adriaan - आप सही हैं - अगर उसने वास्तव में एक ही फ़ाइल में अन्य टेस्ट विधि जोड़ दी है (न केवल मौजूदा विधि के हस्ताक्षर को बदल दिया है), तो उसने ओवरलोडिंग की। लेकिन उनका सवाल ओवरलोडिंग पहलुओं को लक्षित नहीं करता है, इसमें टाइप रूपांतरण और ऑटोबॉक्सिंग शामिल है। –

+0

हाँ, शायद, आप सच हैं, लेकिन कोड में हमने अधिभारित किया है, परिणाम कोड में हमारे पास दो विधियों का परीक्षण (int ए) और परीक्षण (ऑब्जेक्ट ए) है, इसलिए, जैसा कि आप कहते हैं - एक ही नाम, और विभिन्न पैरा। – user471011

3

ऐसा इसलिए है क्योंकि ऑटो-मुक्केबाजी सुविधा। असल में आपने आदिम को लंबे समय तक प्रचारित किया है और परीक्षण विधि को स्वचालित रूप से कॉल करते समय यह अपने समकक्ष प्रकार के लिए सीचिंग कर रहा है, इसलिए यह परीक्षण (ऑब्जेक्ट ए) को कॉल कर रहा है। आप इस Col.test (नया इंटीजर (12)) की तरह देख सकते हैं; यह होगा टेस्ट (ऑब्जेक्ट ए) भी कॉल करें। इसके अलावा आप इस लिंक को Determining if an Object is of primitive type

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