सबसे पहले, शब्दावली का स्पष्टीकरण: हम एक 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।