Theory
Members, Librarians, और Déjà Vu
अब BookBridge को people चाहिए, सिर्फ़ books नहीं। एक Member के पास एक name, एक ID, borrowed books हैं। एक Librarian के पास एक name, एक ID, एक staff code है।
आप 2 classes लिखना शुरू करते हैं और Semester 3 déjà vu feel करते हैं: same name field, same ID logic, दो बार copy की गई। BCA304 में आपने C++ में inheritance से exactly यह smell solve किया।
Java का version एक keyword है: class Member extends Person। और family के ऊपर, Java अपना best trick बनाता है: polymorphism।
Theory
3 Pillars, BookBridge Terms में
Encapsulation: public methods के पीछे private data। Member की fineDue private है; सिर्फ़ payFine() इसे reduce कर सकता है। आपने यह access-controls lesson में build किया; अब इसका exam name है।
Inheritance: class Member extends Person Member को हर Person field और method देता है, plus इसके अपने। ज़्यादा से ज़्यादा एक parent: Java classes के पास सिर्फ़ single inheritance है।
Polymorphism: एक call, कई behaviours: p.describe() अलग तरीके से act करता है इस पर depend करते हुए कि p असल में किसकी तरफ़ point करता है। इस lesson का बाकी हिस्सा इसे unpack करता है।
Practical
एक Family, एक Call, दो Behaviours
class Person {
String name;
void describe() {
System.out.println("Person: " + name);
}
}
class Member extends Person {
int booksIssued;
@Override
void describe() { // same signature: OVERRIDING
System.out.println("Member " + name + " has " + booksIssued + " book(s)");
}
}
public class BookBridge {
public static void main(String[] args) {
Person p = new Member(); // a Member IS a Person
p.name = "Riya";
p.describe(); // whose version runs?
}
}
Quiz
ऊपर की listing में, p Person की तरह declared है पर एक new Member() hold करता है। p.describe() क्या print करता है?
- Person: Riya
- Member Riya has 0 book(s)
- Compile error: एक Person reference एक overridden method call नहीं कर सकता
- दोनों lines, पहले parent फिर child
Show the answer
Member Riya has 0 book(s)
Java run time पर object के REAL type को देखता है, reference के declared type को नहीं: object एक Member है, तो Member का describe() run होता है, booksIssued अपने default 0 पर। यह dynamic method dispatch है, polymorphism की machinery। Option A वह है जो students जो सोचते हैं reference type decide करता है वे answer देंगे, exactly वह misconception जिसे यह question target करता है। Overriding के बारे में कुछ भी compile error नहीं है, और Java कभी दोनों versions run नहीं करता जब तक child explicitly न पूछे (अगले lesson का super)।
At a glance
Overloading बनाम Overriding (Confusion Pair)
| Aspect | Overloading | Overriding |
|---|---|---|
| कहाँ | Same class | Parent और child class |
| Signature | Same name, DIFFERENT parameters | Same name, SAME parameters |
| Decided | Compile time पर | Run time पर (dynamic dispatch) |
| Purpose | एक action के convenient variants | Child inherited behaviour replace करता है |
Think first
उस Mechanism का नाम बताइए
class Librarian के अंदर: issueBook(String title) और issueBook(String title, int days)। Overloading या overriding? Tap करने से पहले decide कीजिए।
Show the answer
Overloading। Same class, same name, अलग parameter lists (एक extra int लेता है), तो compiler हर call site पर arguments से सही एक pick करता है, compile time पर। Overriding को एक parent class चाहिए होगा जिसका issueBook(String) Librarian identical signature से redefine करता है। Exams में apply करने के लिए quick test: different parameters = overloading, एक family में same signature वाली अलग classes = overriding।
Watch out
जहाँ यह Pair Marks खाता है
Swapped Definitions: "overriding का मतलब है same class, different parameters" लिखना 0 score करता है भले ही बाकी सब सही हो। Anchor कीजिए: overload = ज़्यादा parameter loads; override = child parent के ऊपर ride करता है।
Signature Slips: "overriding" करते हुए parameter list बदलिए और आपने silently overload कर दिया है instead; parent's version अभी भी parent references से run होता है। @Override annotation exactly इसीलिए exist करता है ताकि compiler उस slip को catch करे: इसे इस्तेमाल कीजिए।
Theory
वह C++ Contrast जो Examiners को Impress करता है
BCA304 के C++ में, dynamic dispatch को virtual keyword चाहिए था; भूल जाइए और parent's method run होता। Java में, हर instance method default से virtual होता है: overriding बस काम करता है। वह एक sentence, एक Java-बनाम-C++ या polymorphism answer में drop किया गया, real understanding signal करता है। यहाँ आपने जो family बनाई वह load-bearing है: this और super (अगला lesson) इसे navigate करते हैं, और interfaces इस unit के अंत में Java की polymorphism story पूरी करते हैं।
Summary
Key takeaways
- Encapsulation: private fields, public guard methods; inheritance: extends, सिर्फ़ एक parent; polymorphism: एक call, कई forms।
- Overloading: same class, same name, अलग parameter lists, compile time पर resolved।
- Overriding: child एक inherited method को identical signature से redefine करता है, run time पर resolved।
- Person p = new Member(); p.describe() Member का version run करता है: object का type decide करता है, reference का नहीं।
- सारे Java instance methods default से virtual हैं; C++ को virtual keyword चाहिए था।
- @Override compiler को एक genuine override verify कराता है।
- Memory hook: overload loads add करता है, override ऊपर ride करता है।