अपकास्टिंग और डाउनकास्टिंग जावा का महत्वपूर्ण हिस्सा है, जो हमें सरल वाक्यविन्यास का उपयोग करके जटिल कार्यक्रमों का निर्माण करने की अनुमति देता है, और हमें बहुत फायदे देता है, जैसे कि पॉलीमॉर्फिज़्म या विभिन्न वस्तुओं को समूहीकृत करना। जावा किसी भी सुपरक्लास प्रकार की वस्तु के रूप में माना जाने वाला एक उपवर्ग प्रकार की एक वस्तु की अनुमति देता है। इसे अपकमिंग कहा जाता है। Upcasting स्वचालित रूप से किया जाता है, जबकि डाउनकास्टिंग मैन्युअल रूप से प्रोग्रामर द्वारा किया जाना चाहिए , और मैं यह समझाने के लिए अपना सर्वश्रेष्ठ देने जा रहा हूं कि ऐसा क्यों है।
Upcasting और downcasting एक से दूसरे में कास्टिंग आदिम की तरह नहीं हैं, और मुझे विश्वास है कि जब प्रोग्रामर कास्टिंग ऑब्जेक्ट सीखना शुरू करता है, तो बहुत भ्रम पैदा होता है।
बहुरूपता: जावा में सभी विधियां डिफ़ॉल्ट रूप से आभासी हैं। इसका मतलब है कि विरासत में उपयोग किए जाने पर किसी भी विधि को ओवरराइड किया जा सकता है, जब तक कि उस पद्धति को अंतिम या स्थिर घोषित नहीं किया जाता है ।
आप नीचे दिए गए उदाहरण को देख सकते हैं कि getType();
ऑब्जेक्ट (डॉग, पेट, पुलिस डॉग) प्रकार के अनुसार कैसे काम करता है।
मान लें कि आपके पास तीन कुत्ते हैं
कुत्ता - यह सुपर क्लास है।
पालतू कुत्ता - पालतू कुत्ता कुत्ते का विस्तार करता है।
पुलिस डॉग - पुलिस डॉग पालतू कुत्ते का विस्तार करता है।
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
बहुरूपता: जावा में सभी विधियां डिफ़ॉल्ट रूप से आभासी हैं। इसका मतलब है कि विरासत में उपयोग किए जाने पर किसी भी विधि को ओवरराइड किया जा सकता है, जब तक कि उस विधि को अंतिम या स्थिर घोषित नहीं किया जाता है। (एक्सप्लोरेशन बेलॉन्ज टू वर्चुअल टेबल कॉन्सेप्ट)
वर्चुअल टेबल / डिस्पैच टेबल: ऑब्जेक्ट की डिस्पैच टेबल में ऑब्जेक्ट के डायनामिक बाउंड विधियों के पते होंगे। विधि के प्रेषण तालिका से विधि के पते को लाकर विधि कॉल किया जाता है। प्रेषण तालिका एक ही वर्ग से संबंधित सभी वस्तुओं के लिए समान है, और इसलिए आम तौर पर उनके बीच साझा की जाती है।
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
प्रिंटों Normal Dog
obj2.getType();
प्रिंटों Pet Dog
obj3.getType();
प्रिंटों Police Dog
डाउनकास्टिंग प्रोग्रामर को मैन्युअल रूप से करने की आवश्यकता है
जब आप उस secretID();
विधि को लागू करने का प्रयास करते हैं, obj3
जिस PoliceDog object
पर संदर्भित है, लेकिन Dog
पदानुक्रम में एक सुपर क्लास है, तो यह त्रुटि को फेंकता है क्योंकि विधि obj3
तक पहुंच नहीं है secretId()
। उस विधि को लागू करने के लिए आपको उस obj3 को मैन्युअल रूप से डाउनकास्ट करना होगा PoliceDog
( (PoliceDog)obj3).secretID();
जो प्रिंट करता है ID
कक्षा dogName();
में विधि को लागू करने के लिए इसी तरह से PetDog
आपको डाउनकास्ट obj2
करना होगा PetDog
क्योंकि obj2 को संदर्भित किया जाता है Dog
और dogName();
विधि तक पहुंच नहीं है
( (PetDog)obj2).dogName();
ऐसा क्यों है, कि उत्थान स्वचालित है, लेकिन डाउनकास्टिंग मैनुअल होना चाहिए? ठीक है, आप देख रहे हैं, अपकास्टिंग कभी भी विफल नहीं हो सकता। लेकिन अगर आप अलग कुत्तों के एक समूह है और उन सब को अपने प्रकार के लिए एक को खिन्न चाहते हैं, तो इस बात की संभावना है, इन कुत्तों के कुछ विभिन्न प्रकार के वास्तव में कर रहे यानी, कि PetDog
, PoliceDog
, और इस प्रक्रिया, विफल रहता है फेंकने से ClassCastException
।
यही कारण है कि आपको अपनी वस्तुओं को मैन्युअल रूप से डाउन करने की आवश्यकता है यदि आपने अपनी वस्तुओं को सुपर क्लास प्रकार के लिए संदर्भित किया है।
ध्यान दें: यहाँ संदर्भित करके इसका मतलब है कि आप अपने ओजेक्ट्स के मेमोरी एड्रेस को नहीं बदल रहे हैं जब आप इसे डाउनकास्ट करते हैं तो यह अभी भी वही रहता है जो आप उन्हें इस मामले में विशेष प्रकार के लिए ग्रुप कर रहे हैं Dog
Dog
हैAnimal
। जब तक आप एक निश्चित अतिभारित विधि का उपयोग नहीं करना चाहते, तब तक अधिकांश समय अनावश्यक है।callme
दोनों में मौजूद हैAnimal
औरDog
।callme2
केवल में मौजूद हैDog
, जो आपको डालीa
कोDog
यह काम करने के लिए।