Method Overriding in Java: किसी Super Class में किसी Method का जो Signature होता है, उसी Signature का Method जब हम Sub Class में Create करते हैं, तो इस प्रक्रिया को Method Overriding कहा जाता है। जबकि Super Class व Sub Class दोनों में ही Method का नाम समान हो, लेकिन उनके Signature में अन्तर हो, तो फिर चाहे ये Methods Super Class में हों चाहे Sub Class में ऐसे Methods Overloaded Methods कहलाते हैं और इस प्रक्रिया को Method Overloading कहा जाता है। Method Overloading के बारे में हम पिछले अध्याय में पढ चुके हैं। इस अध्याय में हम Method Overriding के बारे में जानेंगे।
पिछले Program में हमने Super Class के Data को Set करने के लिए setEmpData() नाम का Method बनाया है जबकि Sub Class के Data को Set करने के लिए setScientistData() नाम का Method बनाया है। हम समझ सकते हैं, कि दोनों ही Classes में Object के Data को Set करने का ही काम हो रहा है, फिर भी Super Class के Data व Sub Class के Data दोनों को Set करने के लिए हमें अलग-अलग नाम के Methods को Call करना पड रहा है।
इस स्थिति में हम Super Class के Method को Override करके एक Common नाम दे सकते हैं, जिससे हमें दोनों ही Classes के Objects को मान Set करने के लिए दो अलग Method को Call करने की जरूरत नहीं होगी बल्कि हम दोनों ही स्थानों पर एक ही नाम के Method को Use कर सकते हैं। इस तरह का परिवर्तन करने पर हमारा Program निम्नानुसार बन जाएगा:
// Program class Employee { private int ID; private String name; public void setData(int empID, String empName) { ID = empID; name = empName; } public void showData() { System.out.println("\tName : " + name); System.out.println("\tID : " + ID); } } class Scientist extends Employee { private float salary; public void setData(int empID, String empName, float sciSalary) { super.setData(empID, empName); salary = sciSalary; } public void showData() { super.showData(); System.out.println("\tSalary : " + salary); } } class InheritanceDemo { public static void main(String args[]) { Employee you = new Employee(); Scientist me = new Scientist(); you.setData(1000, "Mohan"); me.setData(2000, "Govind", 15000); System.out.println("Your Information"); you.showData(); System.out.println("\nMy Information"); me.showData(); } // Output Your Information Name : Mohan ID : 1000 My Information Name : Govind ID : 2000 Salary : 15000.0
इस Modified Program में हमने Super Class व Sub Class दोनों में ही समान काम करने वाले Methods के नाम समान कर दिए हैं। जब हम Sub Class Scientist का Object Create करते हैं, तब इस Object को Set करने के लिए इस Class के Object के साथ setData() Method को Call करते हैं। ऐसा करने पर Sub Class का setData() Method Call होता है और Sub Class के setData() Method में Super Class के setData() Method को Call किया है।
Super Class के setData() Method को Call करने के लिए हमें super Keyword का प्रयोग करना जरूरी होता है। यदि हम super Keyword का प्रयोग ना करें, तो Sub Class में Super Class का setData() Method तो Call हो जाता है, क्योंकि हम इस Method में दो Argument Pass कर रहे हैं और दो Argument वाला setData() Method Super Class में ही है।
लेकिन जब हम showData() Method को Call करते हैं, तब चूंकि Super Class व Sub Class दोनों ही Classes में showData() Method में कोई Argument Pass नहीं हो रहा है, इसलिए दोनों ही Methods के Signature समान हो गए हैं।
इस स्थिति में जावा हमेंशा Sub Class के ही showData() Method को Execute करता है, Super Class के showData() Method को नहीं। चूंकि हम Sub Class के showData() Method से Super Class के showData() Method को Execute करना चाहते हैं, इसलिए हमें इस super Keyword का प्रयोग setData() Method से पहले करना जरूरी होता है।
super Keyword एक ऐसा Keyword है, जो हमेंशा अपनी Super Class को ही Refer करता है। इसलिए यदि हमें Super Class के किसी ऐसे Method को Call करना हो, जिसका नाम व Parameters की संख्या व Parameters के Data Type तीनों ही समान हों, तो Super Class के Method को Call करने के लिए हमें ऐसे Method को super Keyword के साथ Call करने पर Super Class का Method Call होता है।
लेकिन यदि हम super Keyword के साथ इस प्रकार के Method को Call ना करें, तो Sub Class का ही Method Call होता है। पिछले Program में देखें तो showData() Method का Signature Super Class व Sub Class दोनों में ही निम्नानुसार है:
public void showData();
जबकि setData() Method का Signature दोनों ही Classes में निम्नानुसार अलग-अलग हैं:
// In Super Class public void setData(int empID, String empName) // In Sub Class public void setData(int empID, String empName, float sciSalary)
चूंकि दोनों ही Classes में setData() Method के Signature अलग हैं, इसलिए जब हम Sub Class में Super Class के setData() Method को Call करना चाहते हैं, तब उसमें दो ही Arguments Pass करते हैं, जिससे जावा Compiler दो Parameter वाले setData() को खोजता है और ये Method उसे Super Class में प्राप्त होता है। इसलिए जावा Super Class के setData() Method व Sub Class के setData() Method में तो अन्तर कर सकता है।
लेकिन जब हम showData() Method की बात करते हैं, तब जावा ये तय नहीं कर पाता है कि उसे Super Class के setData() Method को Call करना है, या Sub Class के। ऐसा इसलिए होता है क्योंकि जावा Compiler हमेंशा पहले Sub Class में ही setData() Method को खोजता है। यदि उसे समान Signature का Method Sub Class में प्राप्त नहीं होता है, तो जावा Compiler Super Class में समान Signature के Method को खोजता है।
चूंकि setData() Method का Signature दोनों ही Classes में अलग है, इसलिए जावा पहचान लेता है कि उसे किस Class के setData() Method को Execute करना है, लेकिन showData() Method दोनों ही Classes में समान है, इसलिए जावा Sub Class के showData() Method को Execute करते समय जैसे ही Super Class के showData() Method को खोजता है, उसे Sub Class का ही Derive Method मिल जाता है, क्योंकि दोनों ही Classes में इस Method के Signature समान हैं।
इसलिए जावा हमेंशा Sub Class के showData() Method को ही Execute करने लगता है और एक प्रकार की Infinite Looping बन जाती है। इस प्रकार की स्थिति से बचने के लिए जावा में super Keyword को Add किया गया है। हम जिस Class के Object के साथ Currently प्रक्रिया कर रहे होते हैं, उस Object को this Object Refer करता है, जबकि हम जिस Object के साथ Currently प्रक्रिया कर रहे हैं, उस Object की Class के Super Class को हमेंशा super Object या super Keyword Refer करता है।
सरल शब्दों में कहें तो हम ये भी कह सकते हैं कि super एक ऐसा Object होता है जो अपनी Current Class की Super Class का Object होता है और इस Object के Through हम किसी Sub Class में उसकी Super Class को Directly Access कर सकते हैं।
जिस तरह से हम super Keyword के साथ Super Class के Method का प्रयोग करके Super Class के Method को Call कर सकते हैं, उसी तरह से हम super Keyword के साथ Super Class के Data Members को भी Access कर सकते हैं। यानी यदि हम चाहें, तो हम Sub Class में Super Class के ID व name Field को निम्नानुसार Directly Access करके Set कर सकते हैं:
super.ID = 5000;
super.name = “Gopal”
यदि हम इस Statement को Sub Class के setData() Method में Use करना चाहें, तो उपरोक्त Program की Sub Class के setData() Method को हमें निम्नानुसार Modify करना होगा:
public void setData(int empID, String empName, float sciSalary) { super.ID = empID; super.name = empName; salary = sciSalary; }
चूंकि यदि हम Derived Class या Sub Class Scientist में पिछले setData() Method के स्थान पर इस Method को Use करना चाहते हैं, तो ऐसा हम तभी कर सकते हैं जब Super Class Employee के Data Members Public या Friend हों। क्योंकि super Keyword Super Class के केवल Friend, Protected व Public Data Members व Methods को ही Sub Class में Directly Access करने की सुविधा देता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
Java Programming Language in Hindi | Page: 682 | Format: PDF