2009-05-08 30 views
15

हाय मैं बस यह सुनिश्चित करना चाहता हूं कि मेरे पास ये अवधारणाएं सही हैं। जावा में ओवरलोडिंग का मतलब है कि आपके पास विभिन्न प्रकार के तर्क या विभिन्न डेटा प्रकारों के साथ एक कन्स्ट्रक्टर या विधि हो सकती है। i.eजावा अधिभार बनाम ओवरराइटिंग

public void setValue(){ 
    this.value = 0; 
} 
public void setValue(int v){ 
    this.value = v; 
} 

इस विधि के बारे में कैसे? क्या यह अभी भी ओवरलोडिंग माना जाएगा क्योंकि यह एक अलग डेटा प्रकार लौटा रहा है?

public int setValue(){ 
    return this.value; 
} 

दूसरा सवाल यह है: क्या जावा में अधिलेखन है? क्या यह विरासत से संबंधित है। चलो मैं निम्नलिखित है:

public class Vehicle{ 
    double basePrice = 20000; 
    //constructor defined 
    public double getPrice(){ 
    return basePrice; 
    } 
} 

public class Truck extends Vehicle{ 
    double truckPrice = 14000; 
    //constructor defined 
    public double getPrice(){ 
    return truckPrice; 
    } 
} 

तो अब मान लीजिए कि मैं निम्नलिखित

Truck truck = new Truck(); 

अगर मैं

truck.super.getPrice() 

फोन इस, वाहन वर्ग से मूल्य वापसी होगी जाने 20,000

अगर मैं

पर कॉल करता हूं
truck.getPrice() 

इस ट्रक कक्षा में मूल्य वापसी होगी, 14,000

मेरी जानकारी के दोनों प्रश्नों के लिए सही है?

+0

है मैं setValue() का उपयोग नहीं होगा, क्योंकि यह यह क्या मूल्य के लिए सेट कर रहा है के रूप में अस्पष्ट है। clearValue() स्पष्ट होगा और इस प्रकार अधिभार के लिए कोई आवश्यकता नहीं है। –

+0

का मतलब है ओवरराइडिंग ओवरराइडिंग नहीं। किसी ऑब्जेक्ट की ओवरराइटिंग विधियों को अक्सर जावास्क्रिप्ट में बात की जाती है। अर्थात। Object.toString = function() {वापसी "इस फ़ंक्शन को ओवरराइट कर दिया गया है";}; –

उत्तर

31

आप मूल रूप से सही हैं। ओवरलोडिंग में एक ही कक्षा में कई विधियां हैं जहां विधि का एक ही नाम है। हालांकि, वापसी मूल्य हस्ताक्षर विधि के हिस्से के रूप में नहीं देखा जाता है। इस प्रकार, आप केवल वापसी मूल्य को बदलकर एक विधि अधिभार नहीं कर सकते हैं। आपके उदाहरण से आपके पास निम्न कोड नहीं हो सकता है:

public void setValue() { 
    this.value = 0; 
} 

public int setValue() { 
    return this.value; 
} 

यह संकलित करने में विफल रहेगा।

रॉब की पहचान के रूप में, मेरा मानना ​​है कि आपका मतलब है ओवरराइडिंग, और आपके पास यह सही है। ओवरराइडिंग के साथ नोट करें, आप रिटर्न प्रकार नहीं बदल सकते हैं। जावा 5 के अनुसार, आप बेस क्लास विधि वापस लौटाए गए व्युत्पन्न प्रकार को वापस कर सकते हैं। जावा 5 से पहले, यह एक समान प्रकार होना चाहिए।यही कारण है, आप जावा 5 जब तक नीचे नहीं कर सकते हैं और बाद में:

public class AnimalNoise {} 
public class Miaw extends AnimalNoise {} 

public class Animal { 
    public AnimalNoise makeNoise() { 
     return new AnimalNoise(); 
    } 
} 

public class Cat extends Animal { 
    public Miaw makeNoise() { 
     return new Miaw(); 
    } 
} 

हालांकि, जावा 5 में भी और बाद में, आप निम्न कार्य नहीं कर सकते हैं:

public class Animal { 
    public String makeNoise() { 
     return "silence"; 
    } 
} 

public class Cat extends Animal { 
    public Miaw makeNoise() { 
     return new Miaw(); 
    } 
} 
public class Miaw {} 
अंत में

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

+1

+1 कैथी सिएरा, बर्ट बेट्स द्वारा +1 हेड फर्स्ट जावा – abi1964

4

सही; अधिभार एक ही विधि के लिए एकाधिक हस्ताक्षर प्रदान कर रहा है।

अधिभावी, जो कि मैं क्या लगता है कि आप द्वारा "अधिलेखन" एक विधि एक आधार प्रकार से विरासत में मिली की एक अलग कार्यान्वयन प्रदान करने का कार्य है मतलब है, और मूल रूप से विरासत से बहुरूपता की बात है, यानी

public class Bicycle implements Vehicle { 
    public void drive() { ... } 
} 

public class Motorcycle extends Bicycle { 
    public void drive() { 
     // Do motorcycle-specific driving here, overriding Bicycle.drive() 
     // (we can still call the base method if it's useful to us here) 
    } 
} 
संबंधित मुद्दे