Java Academy · पाठ

Method Overloading के नियम

समझें कि Java overloaded methods को कैसे चुनता है और ambiguity की सामान्य समस्याओं से परिचित हों।

पाठ 1, कुल 4 में से13 चरण

Method Overloading के नियम, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

विधि ओवरलोडिंग के नियम

विधि ओवरलोडिंग से आप एक ही नाम वाली, लेकिन अलग पैरामीटर सूचियों वाली कई विधियाँ परिभाषित कर सकते हैं। Java सटीक समाधान नियमों का उपयोग करके कंपाइल समय पर सबसे उपयुक्त मिलान चुनता है।

ओवरलोडिंग क्या है

ओवरलोड की गई विधियों का नाम समान होता है, लेकिन पैरामीटर की संख्या, प्रकार या क्रम अलग होता है। केवल रिटर्न प्रकार ओवरलोड करने के लिए पर्याप्त नहीं है।

class Calculator {
    int add(int a, int b)     { return a + b; }
    double add(double a, double b) { return a + b; }
    int add(int a, int b, int c)   { return a + b + c; }

    // compile error — same signature, different return type only:
    // long add(int a, int b) { return a + b; }
}

Calculator calc = new Calculator();
System.out.println(calc.add(1, 2));       // 3 (int)
System.out.println(calc.add(1.5, 2.5));   // 4.0 (double)
System.out.println(calc.add(1, 2, 3));    // 6 (3-arg)

समाधान: सबसे विशिष्ट मिलान

Java लागू होने वाली सबसे विशिष्ट विधि चुनता है। प्राथमिकता के क्रम में widening, autoboxing और varargs आज़माए जाते हैं।

static void print(int x)    { System.out.println("int: "    + x); }
static void print(long x)   { System.out.println("long: "   + x); }
static void print(Object x) { System.out.println("Object: " + x); }

print(42);       // int: 42 (exact match — most specific)
print(42L);      // long: 42 (exact match)
print(3.14);     // Object: 3.14 (no float match, widening then autoboxing)

Autoboxing से पहले Widening

Java किसी primitive को wrapper में autobox करने के बजाय उसका widening करना पसंद करता है। इससे आश्चर्यजनक परिणाम आ सकते हैं।

static void display(long n)    { System.out.println("long: " + n); }
static void display(Integer n) { System.out.println("Integer: " + n); }

int x = 100;
display(x); // long: 100 — widens int to long BEFORE autoboxing to Integer
// This surprises many developers!

static void show(Long n)    { System.out.println("Long"); }
static void show(Integer n) { System.out.println("Integer"); }

// show(100); // compile error — ambiguous! Neither is more specific

Null तर्क की अस्पष्टता

ओवरलोड की गई विधियों को null देने पर अस्पष्टता हो सकती है, यदि कई विधियाँ reference प्रकार स्वीकार करती हों। इसे हल करने के लिए null को cast करें।

static void handle(String s)  { System.out.println("String: " + s); }
static void handle(Integer i) { System.out.println("Integer: " + i); }
static void handle(Object o)  { System.out.println("Object"); }

handle((String) null);  // String: null (cast resolves ambiguity)
handle((Integer) null); // Integer: null
// handle(null);        // compile error: ambiguous (String vs Integer)

इनहेरिटेंस के साथ ओवरलोडिंग

विधि समाधान reference variable के घोषित प्रकार पर विचार करता है, रनटाइम प्रकार पर नहीं—यह कंपाइल समय का निर्णय होता है।

class Animal {}
class Dog extends Animal {}

static void greet(Animal a) { System.out.println("Animal"); }
static void greet(Dog d)    { System.out.println("Dog"); }

Animal a = new Dog(); // declared as Animal
greet(a);   // Animal — compile-time type is Animal!

Dog d = new Dog();
greet(d);   // Dog — compile-time type is Dog

ओवरलोडिंग बनाम ओवरराइडिंग

ओवरलोडिंग कंपाइल समय का निर्णय है (स्थिर dispatch)। ओवरराइडिंग वास्तविक ऑब्जेक्ट प्रकार पर आधारित रनटाइम का निर्णय है (गतिशील dispatch)।

class Base {
    void run() { System.out.println("Base.run"); }
}
class Sub extends Base {
    @Override
    void run() { System.out.println("Sub.run"); } // overriding

    void run(int speed) { System.out.println("Sub.run(" + speed + ")"); } // overloading
}

Base b = new Sub();
b.run();     // Sub.run — override (runtime dispatch)
// b.run(10); // compile error — Base doesn't have run(int)

सामान्य ओवरलोडिंग पैटर्न

API में ओवरलोडिंग का सामान्य उपयोग: सुविधा वाली विधियाँ उपलब्ध कराना, जो पूर्ण-पैरामीटर वाले संस्करण को delegate करती हैं।

class Connection {
    void connect(String host, int port, int timeout) {
        System.out.println("Connecting to " + host + ":" + port + " timeout=" + timeout);
    }

    // Convenience overloads
    void connect(String host, int port) {
        connect(host, port, 30); // delegate with default timeout
    }

    void connect(String host) {
        connect(host, 5432); // delegate with default port
    }
}

new Connection().connect("db.example.com");
// Connecting to db.example.com:5432 timeout=30

ओवरलोडिंग और जेनेरिक्स

जेनेरिक विधियों की ओवरलोडिंग में सावधानी आवश्यक है—टाइप इरेज़र कंपाइल होने के बाद दो देखने में अलग signatures को समान बना सकता है।

// Type erasure problem: both methods erase to the same signature!
// static void process(List<String> list) {} // compile error
// static void process(List<Integer> list) {} // duplicate after erasure

// Solutions:
// 1. Use different method names: processStrings / processIntegers
// 2. Use a generic method with bounded type:
static <T extends Number> void processNumbers(List<T> list) {
    list.forEach(n -> System.out.println(n.doubleValue()));
}
processNumbers(List.of(1, 2, 3));
processNumbers(List.of(1.5, 2.5));

व्यावहारिक उपयोग: बिल्डर-शैली ओवरलोड

लचीले ऑब्जेक्ट निर्माण की सुविधा देने के लिए builder/factory API में ओवरलोडिंग सामान्य है।

class Notification {
    final String title, body;
    final String imageUrl;
    final boolean urgent;

    // Factory overloads for convenience
    static Notification simple(String title, String body) {
        return new Notification(title, body, null, false);
    }
    static Notification urgent(String title, String body) {
        return new Notification(title, body, null, true);
    }
    static Notification withImage(String title, String body, String url) {
        return new Notification(title, body, url, false);
    }
    Notification(String title, String body, String imageUrl, boolean urgent) {
        this.title = title; this.body = body;
        this.imageUrl = imageUrl; this.urgent = urgent;
    }
}

ओवरलोडिंग की सामान्य समस्याएँ

ओवरलोडिंग की इन सामान्य गलतियों से बचें:

  • एक ही संचालन के लिए बहुत अधिक ओवरलोड—इसके बजाय बिल्डर का उपयोग करें
  • केवल पैरामीटर के क्रम में अलग ओवरलोड—भ्रमित करने वाले
  • आश्चर्यजनक widening: int, Integer के बजाय long में हल हो सकता है
// Confusing: order-based overloads
// void save(String name, int age)  {}
// void save(int age, String name)  {} // very confusing!

// Better: use a record/DTO
record UserData(String name, int age) {}
void save(UserData data) {}

// Surprising widening
static void m(long x)   { System.out.println("long"); }
static void m(Integer x){ System.out.println("Integer"); }
int v = 5;
m(v); // long! widening preferred over autoboxing

त्वरित जाँच

यदि किसी विधि में long और Integer दोनों पैरामीटर के साथ ओवरलोडिंग की गई हो, तो int तर्क पास करने पर किसे चुना जाएगा?

पुनरावलोकन: विधि ओवरलोडिंग के नियम

मुख्य बातें:

  • ओवरलोडिंग पैरामीटरों की संख्या, प्रकार या क्रम से अलग होती है — केवल रिटर्न प्रकार से नहीं
  • Java तर्कों के घोषित प्रकार का उपयोग करके ओवरलोड का निर्धारण संकलन समय पर करता है
  • प्रिमिटिव को विस्तृत प्रकार में बदलना, उसे रैपर में ऑटोबॉक्स करने से अधिक प्राथमिकता पाता है
  • शून्य तर्क अस्पष्टता पैदा कर सकते हैं — स्पष्ट प्रकार बताकर समाधान करें: handle((String) null)
  • ओवरलोडिंग संकलन-समय पर होती है; ओवरराइडिंग रनटाइम पर — ये अलग तंत्र हैं
  • ऐसे सुविधाजनक ओवरलोड का उपयोग करें जो सभी पैरामीटर वाली मुख्य विधि को सौंपे जाएँ
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “Method Overloading के नियम” पाठ निःशुल्क है?

हाँ—“Method Overloading के नियम” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Method Overloading के नियम” में मैं क्या सीखूँगा?

समझें कि Java overloaded methods को कैसे चुनता है और ambiguity की सामान्य समस्याओं से परिचित हों। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“Method Overloading के नियम” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Method Overloading के नियम
  2. Varargs Parameters
  3. Static Fields और Constants
  4. Utility Classes और Static Factory Methods
← Java Academy पर वापस जाएँ