सबसे पहले, शब्दावली का स्पष्टीकरण: हम एक Child
ऑब्जेक्ट को एक प्रकार के चर में असाइन कर रहे हैं Parent
। Parent
एक वस्तु का एक संदर्भ है, जो एक उप-प्रकार होने के लिए होता है Parent
, ए Child
।
यह केवल अधिक जटिल उदाहरण में उपयोगी है। कल्पना कीजिए कि आप getEmployeeDetails
कक्षा में शामिल होते हैं:
public String getEmployeeDetails() {
return "Name: " + name;
}
हम Child
अधिक जानकारी प्रदान करने के लिए उस पद्धति को ओवरराइड कर सकते हैं :
@Override
public String getEmployeeDetails() {
return "Name: " + name + " Salary: " + salary;
}
अब आप कोड की एक पंक्ति लिख सकते हैं, जो भी विवरण उपलब्ध है, चाहे वह वस्तु एक हो Parent
या Child
:
parent.getEmployeeDetails();
निम्नलिखित कोड:
Parent parent = new Parent();
parent.name = 1;
Child child = new Child();
child.name = 2;
child.salary = 2000;
Parent[] employees = new Parent[] { parent, child };
for (Parent employee : employees) {
employee.getEmployeeDetails();
}
उत्पादन में परिणाम होगा:
Name: 1
Name: 2 Salary: 2000
हम एक के Child
रूप में इस्तेमाल किया Parent
। इसने Child
कक्षा के लिए विशिष्ट व्यवहार किया था , लेकिन जब हमने कॉल किया getEmployeeDetails()
तो हम अंतर को अनदेखा कर सकते थे और ध्यान केंद्रित कर सकते थे कि कैसे Parent
और Child
समान हैं। इसे उपप्रकार बहुरूपता कहा जाता है ।
आपका अद्यतन प्रश्न पूछता है कि Child.salary
जब Child
ऑब्जेक्ट किसी Parent
संदर्भ में संग्रहीत किया गया है , तो पहुंच क्यों नहीं है । उत्तर "बहुरूपता" और "स्थैतिक टाइपिंग" का प्रतिच्छेदन है। क्योंकि जावा संकलित समय पर सांख्यिकीय रूप से टाइप किया जाता है, इसलिए आपको संकलक से कुछ गारंटी मिलती है, लेकिन आपको बदले में नियमों का पालन करने के लिए मजबूर किया जाता है या कोड संकलित नहीं होगा। यहाँ, प्रासंगिक गारंटी यह है कि एक उपप्रकार (जैसे Child
) के प्रत्येक उदाहरण का उपयोग इसके सुपरपेप्ट (उदाहरण Parent
) के उदाहरण के रूप में किया जा सकता है । उदाहरण के लिए, आपको गारंटी दी जाती है कि जब आप पहुँचते हैं employee.getEmployeeDetails
या employee.name
विधि या क्षेत्र को किसी गैर-अशक्त वस्तु पर परिभाषित किया जाता है जिसे किसी employee
प्रकार के चर के लिए सौंपा जा सकता हैParent
। यह गारंटी देने के लिए, कंपाइलर केवल उस स्थिर प्रकार (मूल रूप से, चर संदर्भ का प्रकार Parent
) पर विचार करता है , जब आप यह तय कर सकते हैं कि आप क्या एक्सेस कर सकते हैं। तो अगर आप किसी भी सदस्य उस वस्तु की क्रम प्रकार पर परिभाषित कर रहे हैं उपयोग नहीं कर सकते, Child
।
जब आप वास्तव में एक के Child
रूप में उपयोग करना चाहते हैं तो Parent
यह एक आसान प्रतिबंध है और आपका कोड Parent
इसके सभी उपप्रकारों के लिए उपयोग करने योग्य होगा । जब यह स्वीकार्य नहीं है, तो संदर्भ का प्रकार बनाएं Child
।